탐욕스럽고 게으른 정규식(이해력 질문)

탐욕스럽고 게으른 정규식(이해력 질문)

나는 정규식을 스스로 가르치고 있지만 "탐욕스러운" 대 "게으른" 리프에 갇혀 있습니다.

지금까지 내가 찾은 것은

  • "Greedy"는 정규 표현식이 가능한 한 많은 일치 항목을 찾는다는 것을 의미합니다.
  • »lazy«는 정규 표현식이 가능한 한 적은 수의 일치 항목을 찾는다는 것을 의미합니다.

내가 찾은 대부분의 기사는 a) 내가 계속 사용하고 있는 프로그래밍 언어에서 사용하거나 b) 활성화 사용을 다루고 있지만 grepPerl egrepgrep -P대한 Perl Mode지식이 없기 때문에 그것은 나에게 별로 도움이 되지 않습니다.

나의 이해 문제:저는 이 큰 망치 방식을 사용하게 되었습니다.

  • 게으른 반복은 가능한 가장 짧은 일치 항목을 찾습니다.
  • 결과가 너무 길면 → 중계기 볼륨을 줄이세요?
  • 결과가 여전히 너무 길면 → 다른 해결 방법을 찾아보세요.

이는 HTML 코드에 대한 예제와 실험을 통해 얻은 결과이지만 압도적이지는 않은 결과를 얻었습니다.

내 요약에 몇 가지 중요한 사항이 누락되어 있는지, 어디에 있는지 알려주시면 감사하겠습니다.

답변1

가장 짧은 게임은 아니고 그냥 짧은 게임일 뿐입니다. 탐욕 모드는 가능한 마지막 일치 항목을 찾으려고 시도하고, 게으른 모드는 가능한 첫 번째 일치 항목을 찾으려고 시도합니다. 그러나 가능한 첫 번째 일치가 반드시 가장 짧은 것은 아닙니다.

입력 문자열 foobarbaz과 정규식 o.*a(탐욕적) 또는 o.*?a(게으른)을 가져옵니다.

이 입력 문자열에서 가능한 가장 짧은 일치 항목은 입니다 oba.

그러나 정규식은 왼쪽에서 오른쪽으로 일치하는 항목을 찾으므로 o첫 번째 항목을 찾습니다. 나머지 패턴이 일치하는 경우 해당 패턴은 그대로 유지됩니다.ofoobarbaz

첫 번째 o, .*(greedy)는 obarbaz(전체 문자열)을 먹은 다음 나머지 패턴( a)과 일치하도록 역추적합니다. 그래서 마지막 a 를 찾고 baz마침내 일치합니다 oobarba.

첫 번째 항목 이후에는 o전체 .*?문자열을 (느리게) 먹는 대신 나머지 패턴이 처음으로 나타나는 항목을 찾습니다. 따라서 먼저 o일치하지 않는 두 번째 것을 본 a다음 b일치하지 않는 것을 본 a다음 a일치하는 것을 보고 a게으르기 때문에 중지됩니다. (로 밝혀졌지만 ooba그렇지 않음 oba)

그래서 가장 짧은 버전은 아니지만 욕심쟁이 버전보다는 짧습니다.

답변2

"Perl 모드"는 다음을 의미합니다.Perl 호환 정규식(PCRE). 평신도의 관점에서, 이는 Perl, Python, Ruby, PHP, JavaScript, Java와 같은 기본 정규식이 내장된 경우 대부분의 현대 언어에서 기본적으로 사용되는 정규식 스타일입니다. 기술적으로 말하면 미묘한 차이가 있을 수 있습니다.폴리 메라 제 연쇠 반응Perl 정규식 엔진 등에서 파생되었지만 동일하지는 않지만, 한 언어에서 정규식을 사용할 수 있다면 다른 언어에서도 99% 동일합니다. grep과 같은 이전 도구의 기본 모드였던 POSIX 정규 표현식으로 알려진 이전 스타일보다 개선되었기 때문에 옵션인 위치를 지배합니다.

무탐욕, 일명.게으른grep을 사용하여 행을 일치시키는 맥락에서는 수정자가 중요하지 않습니다. 가질 수 없기 때문이다.완전한 생산 라인게으른 표현과 일치하지만 탐욕스러운 표현과 일치하지 않으며 그 반대의 경우도 마찬가지입니다. 그러나 스위치를 사용하면 -o전체 줄 대신 일치하는 세그먼트 내용이 표시된다는 차이점을 확인할 수 있습니다 (참고. 실제 표시되는 내용과 약간 다릅니다 --color).

»echo "123 abc 456 def 789" > eg.txt
»grep -o -P "(\d+\s[A-Za-z]+\s)+" eg.txt
123 abc 456 def 
»grep -o -P "(\d+\s[A-Za-z]+\s)+?" eg.txt
123 abc 
456 def 
»grep -o -P "\d+\s[A-Za-z]+\s\d+" eg.txt
123 abc 456
»grep -o -P "\d+\s[A-Za-z]+\s\d+?" eg.txt
123 abc 4
56 def 7

이런 식으로 grep(사용)하면 탐욕이 영향을 미칠 것입니다 -o. 패턴이 포함된 전체 행을 일치시키기 위해 grep을 사용하는 경우 ?탐욕스럽지 않은 것은 어느 쪽이든 중요하지 않습니다.

간단히 말해서, 탐욕스러운 매칭은 최대한 많이 일치하고, 탐욕스럽지 않은 매칭은 가능한 한 적게 일치합니다.

관련 정보