prosource

?:, ?!와 ?=의 차이

probook 2023. 8. 11. 22:25
반응형

?:, ?!와 ?=의 차이

저는 이 표현들의 의미를 찾아보았지만 정확한 차이를 이해할 수 없었습니다.

그들은 이렇게 말합니다.

  • ?:식을 일치시키지만 캡처하지 않습니다.
  • ?=접미사를 일치시키되 캡처에서 제외합니다.
  • ?!접미사가 없는 경우 일치시킵니다.

저는 이것들을 간단한 RegEx에서 사용해 보았고 모두에게 비슷한 결과를 얻었습니다.

예를 들어, 다음 세 가지 식을 사용하면 매우 유사한 결과를 얻을 수 있습니다.

  • [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의 "와 만 "ab"의 와 "a"의 "a"는 하지 않습니다.에 반에면.a(?!b)"는 ""a만 "a".ac"의 "a"는 일치하지 않습니다.

?:그리고.?=은 것은입니다.?=을 제외하는 동안 체일 치제 외하 는동 안?:캡처 그룹을 만들지 않습니다. 예를 들면 그서예를들면래,면들,a(?:b)"의 , "ab", "ab", "ab"과 일치합니다.a(?=b)"sys"의 "a"만 일치합니다.a(b)"ab"의 "ab"과 일치하고 "b"를 포함하는 캡처를 만듭니다.

  • ?:캡처하지 않는 그룹에 대한 것입니다.
  • ?=입니다.
  • ?!는 부정적인 것입니다.
  • ?<=뒤에서 긍정적인 시선을 위한 것입니다.
  • ?<!뒤에서 부정적인 시선을 위한 것입니다.

매우 좋은 튜토리얼과 정규 표현식에서 미리 보기에 대한 예제를 보려면 미리 보기제로 길이 어설션 뒤를 확인하십시오.

세 가지 표현식과 캡처 그룹을 적용하여 각 동작을 분석해 보겠습니다.

  • () 캡처 그룹 - 괄호 안에 있는 정규식이 일치해야 하며 일치하면 캡처 그룹이 생성됩니다.
  • (?:) 비포용 그룹 - 괄호 안의 정규식이 일치해야 하지만 캡처 그룹을 만들지 않습니다.
  • (?=) 긍정적인 미리 보기 - 정규식이 일치해야 함을 주장합니다.
  • (?!) 부정적인 미리 보기 - 정규식을 일치시키는 것이 불가능하다고 주장합니다.

신합다를 적용해 q(u)i그만두기 위해
qq와 캡처 그룹을 일치시킵니다.u일치합니다.
캡처 그룹 내부의 일치 항목이 생성되고 캡처 그룹이 생성됩니다.
따라서 엔진은 다음과 같이 계속 작동합니다.i.
그리고.ii와 일치할 것입니다.
마지막 일치 시도가 성공했습니다.
qui가 일치하고 u가 포함된 캡처 그룹이 생성됩니다.

신합다를 적용해 q(?:u)i그만두기 위해
다시.q일치 q 및 비임의 그룹u일치합니다.
비캡처 그룹에서 일치하는 항목이 생성되지만 캡처 그룹은 생성되지 않습니다.
따라서 엔진은 다음과 같이 계속 작동합니다.i.
그리고.ii와 일치할 것입니다.
마지막 일치 시도가 성공했습니다.
qui가 일치합니다.

신청합시다q(?=u)i그만두기 위해
미리 보기는 긍정적이며 다른 토큰이 뒤따릅니다.
다시.q일치 q 및u일치합니다.
그러나 미리 보기에서 일치하는 항목은 폐기되어야 하므로 엔진은 다음에서 뒤로 물러납니다.i당신에게 현악기로.
전방 주시가 성공적이었기 때문에 엔진은 다음과 같이 계속 작동합니다.i.
그렇지만i당신과 일치할 수 없습니다.
따라서 이 일치 시도는 실패합니다.

신합다를 적용해 q(?=u)u그만두기 위해
미리 보기는 긍정적이며 다른 토큰이 뒤따릅니다.
다시.q일치 q 및u일치합니다.
그러나 미리 보기에서 일치하는 항목은 폐기되어야 하므로 엔진은 다음에서 뒤로 물러납니다.u당신에게 현악기로.
전방 주시가 성공적이었기 때문에 엔진은 다음과 같이 계속 작동합니다.u.
그리고.u당신과 일치할 것입니다.따라서 이 일치 시도는 성공적입니다.
qu가 일치합니다.

신합다를 적용해 q(?!i)u그만두기 위해
이 경우에도 앞을 내다보는 것은 긍정적입니다(왜냐하면i일치하지 않음) 및 그 다음에 다른 토큰이 나옵니다.
다시.q일치 q 및i당신과 어울리지 않습니다.
미리 보기에서 일치하는 항목은 폐기해야 하므로 엔진이 다음 위치에서 뒤로 이동합니다.u당신에게 현악기로.
전방 주시가 성공적이었기 때문에 엔진은 다음과 같이 계속 작동합니다.u.
그리고.u당신과 일치할 것입니다.
따라서 이 일치 시도는 성공적입니다.
qu가 일치합니다.

결론적으로, 미리 보기 그룹과 캡처하지 않은 그룹 간의 진정한 차이는 존재를 테스트하거나 테스트하여 일치 항목을 저장하는 것입니다.

그러나 그룹을 캡처하는 것은 비용이 많이 들기 때문에 신중하게 사용해야 합니다.

를 맞춰보세요.foobar이에 대항하여:

/foo(?=b)(.*)/
/foo(?!b)(.*)/

번째 하며 첫 번째 로 "합니다. - "bar"와 "bar"는 일치합니다.(?=b)는 'b'와 일치하지만 사용하지 않으며 다음 괄호로 사용됩니다.

두 번째 정규식은 "foo" 다음에 "b"와 다른 것이 올 것으로 예상하기 때문에 일치하지 않습니다.

(?:...)단순함과 정확히 동일한 효과를 가집니다.(...)그러나 하위 일치로 해당 부분을 반환하지 않습니다.

어설션을 이해하는 가장 간단한 방법은 어설션을 정규식에 삽입된 명령어로 처리하는 것입니다.엔진이 어설션까지 작동하면 어설션에 설명된 상태를 즉시 확인합니다.결과가 참이면 정규식을 계속 실행합니다.

이것이 진정한 차이입니다.

>>> re.match('a(?=b)bc', 'abc')
<Match...>
>>> re.match('a(?:b)c', 'abc')
<Match...>

# note:
>>> re.match('a(?=b)c', 'abc')
None

"" 이후 내용에 신경 쓰지 않으면?또는 "?=", "?:" 및 "?똑같습니다.둘 다 사용해도 괜찮습니다.

그러나 추가 프로세스를 위해 이러한 컨텐츠가 필요한 경우(전체와 일치하는 것만이 아님).이 경우 "a(b)"를 사용하면 됩니다. "?"를 사용해야 합니다.대신에원인 "?:"그냥 통과할 것입니다.

언급URL : https://stackoverflow.com/questions/10804732/difference-between-and

반응형