? :,?!의 차이점은 무엇입니까? 및? = 정규식에서?
이 표현의 의미를 찾았지만 정확한 차이점을 이해할 수 없었습니다. 이것이 그들이 말하는 것입니다.
?:
표현식과 일치하지만 캡처하지는 않습니다.?=
접미사와 일치하지만 캡처에서 제외합니다.?!
접미사가 없으면 일치합니다.
나는 이것을 간단한 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과 정확히 동일한 효과가 (...)
있지만 해당 부분을 부분 일치로 반환하지 않습니다.
참고 URL : https://stackoverflow.com/questions/10804732/what-is-the-difference-between-and-in-regex
'program story' 카테고리의 다른 글
Guice의 인젝터에서 주석이 달린 인스턴스를 검색하는 방법은 무엇입니까? (0) | 2020.10.09 |
---|---|
DBMS_OUTPUT.PUT_LINE이 인쇄되지 않습니다. (0) | 2020.10.09 |
열에 'hsa ..'와 같은 문자열이있는 행 선택 (부분 문자열 일치) (0) | 2020.10.09 |
HashMap에서 효율적으로 조회하고 삽입하는 방법은 무엇입니까? (0) | 2020.10.08 |
JavaScript에서 SQLite 데이터베이스에 액세스 할 수 있습니까? (0) | 2020.10.08 |