견적

2017-05-15 2 views
5

안에 내가 사용하고 작동되는 다음과 같은 정규식이있는 경우 괄호를 무시하는 정규식을 알려주기 :견적

이 문자열 @extends('template', 'test') 올바르게 그룹과 저를 준다 내가 필요한

/\[email protected](@?\w+(?:::\w+)?)([ \t]*)(\(((?>[^()]+) | (?3))* \))?/x

. 문자열은 따옴표 안에 닫히지 않은 괄호가 포함 된 경우

문제는 - 그것은 실패합니다

@extends('template', 'te)st')

가 어떻게 내부 인용 부호있는 괄호 (무시이 정규식을 말할 수있는 출력으로 @extends('template', 'te)을 제공합니다 http://regexr.com/v1?396ci

그리고 그녀를 : 중 ' 또는 ") 여기

문제의 RegExr 데모입니다 전자는 모든 통과 할 수있을 것입니다 문자열 목록입니다 : 나는 그것을 좁혀했습니다

@extends('template', 'test')  // working 
@extends('template', $test)  // working 
@extends('template', 'te()st') // working 
@extends('template', 'te)st') // broken 
@extends('template', 'te())st') // broken 
@extends('template', 'te(st') // broken 
@extends('template', 'test)') // broken 
@extends('template', '(test') // broken 

- 그리고 나는

(
    \( <-- only if not inside quotes 
    ( 
     (?>[^()]+) | (?3) 
    )* 
    \) <-- only if not inside quotes 
)? 

을 말할 수있을 필요가 있다고 생각하지만 난 것 같다 캔트 당신은이 목적을 여기

에 대한 내다을 사용할 수 있습니다

답변

3

이러한 특정 괄호에 해당 규칙을 적용하는 방법을 해결하는 것은 모든의 두 번째 인수에 일치 내 정규식입니다

| [\ w) (+

고장 (= (\ w +) \ w +()?) :

' : 따옴표로 문자열에 대한 검색을 시작합니다

?=XXX) : 긍정적는 XXX가 존재 앞서

입니다 보장하는 미리 보면: 여는 중괄호 또는 닫는 중괄호 검색

이제이 미리보기가 성공적이면 견적 뒤에 괄호가 오도록 할 수 있습니다.이제 우리는 단순히 괄호

[\w\)\(]+ 확인하기 위해 정규식을 쓸 수 있습니다 : 우리가 그 안에 괄호와 따옴표를 찾을 수 있다는 것을 그냥

지금하고에게, 우리는 적절한를 사용하는 경우 - 다른 조건을 사용할 수 있습니다 각각의 경우에 대한 규칙

(?(?=regex)then|else)

여기 호입니다 w 구현했습니다 :

(?(?='(?=(\w+\)|\w+\())) <- condition, same as above 
'[\w\)\(]+' <- We have a match so we ignore parenthesis 
|'\w+' <- Here we don't 
) 

ps. 나는 당신이 당신의 정규 표현식에서 다른 부분을 위해 작성한 것을 많이 이해하지 못했고, 어쩌면 다른 경우를 다루기 위해 원래 정규 표현식을 수정하려고하지 않을 것입니다. 위에서 언급 한 매개 변수와 함께 두 번째 매개 변수에 대한 점검을 간단히 전환 할 수 있습니다.

여기 내 모든 정규 사례가 나와 있습니다.

\[email protected]\w+\('[\w+\s]+',\s+(?(?='(?=(\w+\)|\w+\()))'[\w\)\(]+'|('\w+'|\$\w+))\)

당신은 테스트 케이스 here

PS를 볼 수 있습니다. 실제로 작동한다는 것을 보여주기 위해 몇 가지 실패한 테스트 케이스를 추가했습니다.

+0

고마워요 @Mayank - 그게 다가 왔지만 테스트 케이스에 마지막')'이 포함되어 있지 않습니까? – Laurence

+0

p.s. 원래 질문에 포함하는 것을 잊어 버린 추가 테스트 케이스 하나를 추가했습니다. – Laurence

+0

@Laurence, 예상대로 작동합니까? –