2012-04-18 2 views
2

aibicidieif (더 복잡한 문자열이지만 비슷한 형식 임) (?<=i).*?(?=i)과 같은 정규식을 사용했지만 첫 번째 및 마지막 요소 af을 캡처하지 않았습니다.regex에서 선택적 어설 션을 만드는 방법은 무엇입니까?

i 구분 기호 사이의 모든 것을 원하지만 정규식은 그 전후에 i 문자 만 검색합니다. (?=i)(?<=i)을 선택적으로 만들 수있는 방법이 있습니까?

http://regexr.com?30mjf

+0

을 F.Müller @ :

언어는 가변 길이 lookbehinds를 지원하지 않는 경우, 여기에 여전히 작동합니다 대안입니다 ', 그렇지 않으면 "; 당신은 lookbehind를 제거 할 수도 있습니다 (그리고 lookaheads도 마찬가지입니다). 일부 정규 표현식은 정량화 된 어설 션을 구문 오류로 취급합니다. 그렇지 않은 경우도 그렇습니다. –

+0

Btw, __does__를 제공 한 정규 표현식은'f'를 캡쳐합니다. – alan

+0

내가 틀릴 수도 있지만 '?'연산자가 lookahead/behind 어쨌든 작동하지 않는다고 생각합니다. – alan

답변

4

어떤 언어를 사용하고 있습니까? 대부분의 언어에서 당신은 파이썬에서, 예를 들어, 정규식을 사용하여 문자열을 분할 할 수 있습니다 :

다음 r'i'
>>> re.split(r'i', 'aibicidieifi') 
['a', 'b', 'c', 'd', 'e', 'f', ''] 

은 더 복잡한 정규식이 무엇이든 나타내는 문자열로 대체 할 수있다.

은 또한이 같은 것을 할 수있는 다음 내다에 교대로 앵커를 추가

(?<=i|^).*?(?=i|$) 

을 지금 여전히 시작과 문자열의 끝 문자와 일치하는 것입니다 당신을 lookbehind 그러나 일부 언어는 지원하지 않습니다 가변 길이 lookbehinds 그래서이 작동하지 않을 수 있습니다. ``(<= 내가?)가 난`앞에 것 "을 의미?

(?:(?<=i)|^).*?(?=i|$) 
+0

예 정규 표현식이 내가 찾고있는 것입니다. 나는 이것을 할 수있는 함수가 있음을 알고 있지만 순수한 정규식 솔루션을 찾고 있었다. – Ryder

0

단순히 [^i]+는 일을하지 않을까요? 당신이

$valuesArray = explode('i', $input); 

그런 다음 생성 된 배열에서 값에 액세스 단지 수행 될 그들을하고 있습니다로 입력 문자열과 구분 기호를 가정

+0

이 경우 예, OP가 더 복잡 할 수 있다고 말 했으므로 현재 Lookbehind 및 Lookahead에있는 것은 아마도 단 한 문자가 아닙니다 . –

+0

맞아. 맞아. –

0

로 간단합니다.

관련 문제