[javascript] ? :,?!의 차이점은 무엇입니까? 및? = 정규식에서?
이 표현들의 의미를 찾았지만 정확한 차이점을 이해하지 못했습니다. 이것이 그들이 말하는 것입니다.
?:
표현식과 일치하지만 캡처하지는 않습니다.?=
접미사와 일치하지만 캡처에서 제외합니다.?!
접미사가 없으면 일치합니다.
나는 이것을 간단한 RegEx에서 사용해 보았고 모두에게 비슷한 결과를 얻었습니다. 예 : 다음 3 개의 표현식은 매우 유사한 결과를 제공합니다.
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*
답변
의 차이 ?=
와는 ?!
전자가 일치하도록 주어진 식을 필요로하며, 후자는 그것을하는 데 필요한 것입니다 하지 일치합니다. 예를 들어 a(?=b)
“ab”의 “a”는 일치하지만 “ac”의 “a”는 일치하지 않습니다. 반면 a(?!b)
“ac”의 “a”는 일치하지만 “ab”의 “a”는 일치하지 않습니다.
의 차이 ?:
와는 ?=
즉 ?=
동안 제외 전체 경기에서 표현 ?:
단지 캡처 그룹을 만들지 않습니다. 예를 들어 a(?:b)
“abc”의 “ab”와 일치하는 반면 “abc” a(?=b)
의 “a”만 일치합니다. a(b)
“ABC”에서 “AB”를 일치합니다 및 은 “B”를 포함하는 캡처를 만들 수 있습니다.
답변
?: is for non capturing group
?= is for positive look ahead
?! is for negative look ahead
?<= is for positive look behind
?<! is for negative look behind
여기에서 확인하십시오 : http://www.regular-expressions.info/lookaround.html 정규식의 lookahead에 대한 아주 좋은 자습서 및 예제를 보려면.
답변
더 잘 이해하기 위해 세 가지 표현식과 캡처 링 그룹을 적용하고 각 동작을 분석해 보겠습니다.
()
캡처 링 그룹 -괄호 안의 정규식이 일치해야하며 일치하면 캡처 링 그룹이 생성됩니다.(?:)
비 캡처 그룹 -괄호 안의 정규식이 일치해야하지만 캡처 그룹을 생성하지 않습니다.(?=)
긍정적 인 전망 -정규식이 일치해야한다고 주장합니다.(?!)
부정적인 전망 -정규식과 일치하는 것이 불가능하다고 주장합니다.
의 적용합시다 q(u)i
을 종료합니다 . q 와 q
일치 하고 캡처 그룹 은 u 와 일치 합니다. 캡처 그룹 내에서 일치하는 항목을 가져오고 캡처 그룹이 생성됩니다. 그래서 엔진은 . 그리고 i 와 일치 합니다. 이 마지막 경기 시도는 성공했습니다. qui 가 일치되고 u 와 함께 캡처 링 그룹 이 생성됩니다.u
i
i
의 적용합시다 q(?:u)i
을 종료합니다 . 다시, q 와 q
일치 하고 비 캡처 그룹 은 u 와 일치 합니다. 비 캡처 그룹의 일치 항목을 가져 오지만 캡처 그룹은 생성되지 않습니다. 그래서 엔진은 . 그리고 i 와 일치 합니다. 이 마지막 경기 시도는 성공했습니다. qui 가 일치합니다u
i
i
의 적용합시다 q(?=u)i
을 종료합니다 . 예견은 긍정적이고 다른 토큰이 뒤 따릅니다. 다시 말하지만, q
일치 Q 와 u
일치 U를 . 다시 말하지만, 미리보기의 일치 항목을 삭제해야하므로 엔진 i
은 문자열에서 u로 되돌아갑니다 . 예견이 성공 했으므로 엔진은 i
. 그러나 ui
와 일치 할 수 없습니다 . 그래서이 매치 시도는 실패합니다.
의 적용합시다 q(?=u)u
을 종료합니다 . 예견은 긍정적이고 다른 토큰이 뒤 따릅니다. 다시 말하지만, q
일치 Q 와 u
일치 U를 . 미리보기의 일치 항목을 삭제해야하므로 엔진 u
은 문자열에서 u로 되돌아갑니다 . 예견이 성공 했으므로 엔진은 u
. 그리고 uu
와 일치 합니다. 그래서이 매치 시도는 성공했습니다. qu 가 일치합니다.
의 적용합시다 q(?!i)u
을 종료합니다 . 이 경우에도 예견은 긍정적이고 ( i
일치하지 않기 때문에 ) 다른 토큰이 뒤 따릅니다. 다시 말하지만, q
일치하는 질문을 하고 i
일치하지 않는 유를 . 미리보기의 일치 항목을 삭제해야하므로 엔진 u
은 문자열에서 u로 되돌아갑니다 . 예견이 성공 했으므로 엔진은 u
. 그리고 uu
와 일치 합니다. 그래서이 매치 시도는 성공했습니다. qu 가 일치합니다.
결론적으로, 미리보기 그룹과 비 캡처 그룹의 실제 차이점은 존재를 테스트하거나 일치를 테스트하고 저장하려는 경우에 관한 것입니다. 캡처 그룹은 비용이 많이 들기 때문에 신중하게 사용하십시오.
답변
foobar
다음 항목과 일치시켜보십시오 .
/foo(?=b)(.*)/
/foo(?!b)(.*)/
첫 번째 정규식은 일치하고 첫 번째 하위 (?=b)
일치 로 “bar”를 반환 합니다. ‘b’와 일치하지만 소비하지 않고 다음 괄호로 남겨 둡니다.
두 번째 정규식은 “foo”뒤에 ‘b’와 다른 것이 올 것으로 예상하기 때문에 일치하지 않습니다.
(?:...)
simple과 정확히 동일한 효과가 (...)
있지만 해당 부분을 부분 일치로 반환하지 않습니다.
답변
어설 션을 이해하는 가장 간단한 방법은이를 정규식에 삽입 된 명령으로 처리하는 것입니다. 엔진이 어설 션을 실행하면 어설 션에 설명 된 조건을 즉시 확인합니다. 결과가 참이면 정규식을 계속 실행하십시오.
답변
이것이 진짜 차이점입니다.
>>> re.match('a(?=b)bc', 'abc')
<Match...>
>>> re.match('a(?:b)c', 'abc')
<Match...>
# note:
>>> re.match('a(?=b)c', 'abc')
None
“? :”또는 “? =”다음의 내용을 신경 쓰지 않으면 “? :”및 “? =”는 동일합니다. 둘 다 사용해도 괜찮습니다.
그러나 추가 프로세스를 위해 이러한 콘텐츠가 필요한 경우 (단지 전체 일치가 아닙니다.이 경우 단순히 “a (b)”를 사용할 수 있습니다.) 대신 “? =”를 사용해야합니다. 원인 “? :”은 그냥 지나갈 것입니다.