2013-12-22 3 views
0

제 질문은 각각의 선택을 반복적으로하고 싶지 않다는 점을 제외하고는 this과 매우 비슷합니다.Regex : 반복을 허용하지 않는 임의의 순서로 선택 사항을 매치합니다.

예제 : 정규식 (A와 B는 복잡 할 수 있으며 이러한 과도하게 단순화된다) 다음의 문자열과 일치해야 :

XAB 
XBA 
XA 
XB 
X 

일치하지 수 XAA, XBB, XABA, XABB, XBAA

여기

는 내가 지금까지 무엇을 가지고 :

/(X)(?:(A)|(B)){0,2}$/

이것은 반복 (예 : XAA 등)을 허용하고, PHP에서 XB에 문제를 일으킬 것 같다 하늘의 배열 요소

편집 : X, A 및 B (사용 가능한 경우)의 실제 값을 가져와야 함을 잊어 버렸습니다. 전체 문자열과 일치하는 것이 아닙니다.

+0

당신은 기본적으로 할 수있는 말을하는지 :

$pattern = <<<'LOD' ~ (?(DEFINE) (?<X> FOO) (?<A> BAR) (?<B> BAZ) ) ^ \g<X> (?: \g<A> (?! .* \g<A>) | \g<B> (?! .* \g<B>)){0,2} $ ~xs LOD; 

\g<A> (?! .* \g<A>)

는 ("아무것도 군 다음에하지"즉) 때문에 부정적 예측의 그룹 A는 문자열에 한 번만 존재하는 강제 'A' 또는'B'를 두 번 이상 매치하지 마십시오. 왜 그저 검사 만하고 정규식을 버리지 않으시겠습니까? '(substr_count ($ 문자열, 'A') 2 =>) 에코 경우 '오류!'; 당신이 그것을 고수하려는 경우 여기에' –

+0

는 정규식 데모의 ... http://regex101.com/r/kD2fA1 –

답변

1

사용 negative lookahead assertions :

/(X)(?!A{2})(?!B{2})(?:(A)|(B)){0,2}$/ 

설명 : "어떻게 선택 그룹 반복하지 않도록?"

(X)  # Match and capture X 
(?!A{2}) # Assert that it's impossible to match AA 
(?!B{2}) # Same for BB 
(?:  # Non-capturing group: 
(A)  # Match and capture A 
|   # or 
(B)  # Match and capture B 
){0,2} # Do this 0-2 times 
$   # Then match the end of the string 
1

가장 깨끗한 방법은 각 그룹을 정의하고 특정 순서로 그 정의를 사용하는 것입니다 : 물론

# Start defining 
(?(DEFINE) 
    (?<X>xrules) 
    (?<A>arules) 
    (?<B>brules) 
) 
# End defining 
^     # begin of string 
(?&X)    # Use rule X 
    (?:    # non-capturing group 
     (?&A)(?&B)? # Use rule A and make rule B optional 
    |     # or 
     (?&B)(?&A)? # Use rule B and make rule A optional 
    )?    # make it optional 
$     # end of string 

, 당신은 [A-Z]+[a-z]+brules 같은 유효한 정규식 xrules을 변경할 수 있습니다.

Online demo

+0

왜이 솔루션은 팀의 것과 같이 X, A 또는 B와 별도로 일치하지 않습니까? –

+0

@ user371699 아니기 때문에. 음, 당신은 항상 캡쳐 그룹을 감쌀 수 있지만 추한 것입니다. 당신은 아마도 두 개의 대답을 병합 할 수 있습니다. – HamZa

+0

괄호 안의 것은'? :'이 없으면 캡처 된 것으로 생각했습니다. 왜 이것이 예외 인 것 같습니까? –

0

귀하의 질문이 제목을 할 수 있습니다.

관련 문제