. *의 차이점은 무엇입니까? 그리고. * 정규식?


142

정규식을 사용하여 문자열을 두 부분으로 나누려고합니다. 문자열의 형식은 다음과 같습니다.

text to extract<number>

나는 사용 (.*?)<하고 있고 <(.*?)>잘 작동하지만 정규식을 조금 읽은 후에 왜 ?표현에 왜 필요한지 궁금해하기 시작했습니다 . 나는이 사이트를 통해 그들을 찾은 후에 만 ​​그렇게 했으므로 차이점이 무엇인지 정확히 알 수 없습니다.


답변:


172

욕심쟁이와 욕심없는 정량 자의 차이점입니다.

입력을 고려하십시오 101000000000100.

사용하면 1.*1, *욕심 - 그것은 일치 할 때까지 철수 후 마지막에 모든 방법을 일치 할 것이다 1당신을 떠나 1010000000001.
.*?욕심이 없습니다. *아무것도 일치하지 않습니다, 그러나 그것은 일치 할 때까지 추가 문자를 일치하려고합니다 1결국 일치 101.

모든 한정사가 아닌 욕심 모드를 가지고 : .*?, .+?, .{2,6}?, 심지어 .??.

귀하의 경우 비슷한 패턴 <([^>]*)>이보다 큰 부호 이외의 항목과 일치 할 수 있습니다 (엄격히 말하면 >중간 <및 사이 이외의 0 개 이상의 문자와 일치합니다 >).

수량 자 치트 시트를 참조하십시오 .


아 대단하다>> 기호 이외의 마지막 것 중 하나를 좋아한다!
Doug

1
욕심이 욕심 ?이 아닌 것과 어떻게 다른지 설명하거나 보여줄 수 있습니까 ???
AdrianHHH

4
확실한. 문자열 "abc"의 경우 정규 표현식 /\w\w?\w/이 전체 문자열과 일치합니다 . 욕심이 "abc"많기 때문 ?입니다. /\w\w??\w/게으른-그것은 단지 일치 "ab"합니다. "abc"나중에 실패하는 경우 에만 역 추적하고 일치 합니다.
Kobi

184

욕심과 비 욕심에

정규 표현식에서 기본적으로 반복하는 것은 욕심입니다 . 가능한 한 많은 담당자와 일치 시키려고 노력하고 이것이 작동하지 않고 역 추적해야 할 때 전체 패턴이 일치 할 때까지 한 번에 하나의 적은 담당자를 일치시킵니다. 녹이다. 결과적으로 경기가 마지막으로 이루어질 때 욕심 많은 반복은 가능한 한 많은 담당자와 일치 합니다.

?에이 동작을 변경 정량 반복과 같은 비 욕심 도 불리는 꺼려 ( 예를 들면 자바 ) (때로는 "게으른"). 대조적으로,이 반복은 가능한 한 적은 수의 담당자와 일치 시키려고 시도 하며, 이것이 작동하지 않고 역 추적해야하는 경우, 한 번 더 담당자와 일치하기 시작합니다. 결과적으로 경기가 마지막으로 일어날 때 꺼리는 반복은 가능한 한 적은 담당자와 일치 합니다.

참고 문헌


예 1 : A에서 Z로

하자이 두 패턴을 비교 : A.*ZA.*?Z.

다음과 같은 입력이 주어집니다.

eeeAiiZuuuuAoooZeeee

패턴은 다음과 일치합니다.

먼저 무엇에 초점을 맞추자 A.*Z. 그 첫 번째 일치하는 경우 A.*, 욕심, 처음 시도되는 것은 많은으로 일치하도록 .가능한 한.

eeeAiiZuuuuAoooZeeee
   \_______________/
    A.* matched, Z can't match

Z일치하지 않기 때문에 엔진이 역 추적 .*한 다음 하나 더 적어야합니다 ..

eeeAiiZuuuuAoooZeeee
   \______________/
    A.* matched, Z still can't match

마지막으로 우리가 이것에 올 때까지 이것은 몇 번 더 발생합니다.

eeeAiiZuuuuAoooZeeee
   \__________/
    A.* matched, Z can now match

이제 Z일치 할 수 있으므로 전체 패턴이 일치합니다.

eeeAiiZuuuuAoooZeeee
   \___________/
    A.*Z matched

대조적으로, 마지 못한 반복은 A.*?Z처음 .에는 가능한 한 적은 수를 맞추고 .필요에 따라 더 많이 가져 갑니다. 입력에서 두 개의 일치 항목을 찾는 이유를 설명합니다.

다음은 두 패턴이 일치하는 것을 시각적으로 나타낸 것입니다.

eeeAiiZuuuuAoooZeeee
   \__/r   \___/r      r = reluctant
    \____g____/        g = greedy

예 : 대안

많은 응용에서, 상기 입력에서 두 개의 매칭이 요구되는 것이므로 .*?, 욕심 대신에 꺼리는 것이 사용 .*되어 오버 매칭 을 방지한다. 그러나이 특정 패턴의 경우 부정 문자 클래스를 사용하는 더 나은 대안이 있습니다.

패턴 A[^Z]*Z은 또한 A.*?Z위 입력에 대한 패턴 과 동일한 두 개의 일치 항목을 찾습니다 ( ideone.com 참조 ). [^Z]불리는 무엇 인 부정 문자 클래스 는 모든 항목과 일치하지만, : Z.

두 패턴의 주요 차이점은 성능에 있습니다. 더 엄격하면 부정 된 문자 클래스는 주어진 입력에 대해 한 가지 방식과 만 일치 할 수 있습니다. 이 패턴에 대해 탐욕 스럽거나 꺼리는 수정자를 사용하는 것은 중요하지 않습니다. 실제로 일부 맛에서는 더 나은 작업을 수행 할 수 있으며 소급 수량 자라고하는 것을 사용할 수 있습니다.

참고 문헌


예 2 : A에서 ZZ로

이 예제는 설명이 필요합니다. 동일한 입력에서 욕심, 꺼림 및 부정 문자 클래스 패턴이 어떻게 다르게 일치하는지 보여줍니다.

eeAiiZooAuuZZeeeZZfff

위의 입력과 일치합니다.

다음은 일치하는 내용을 시각적으로 나타낸 것입니다.

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g

관련 주제

이것들은 관심있는 주제를 다루는 stackoverflow에 관한 질문과 답변에 대한 링크입니다.

수있는 하나의 욕심이 반복 outgreed 다른


1
나는 ideone.com이 아니라 rubular.com을 말하려고했습니다. 다른 사람들에게 :이 게시물을 수정하지 말고 다음 예제와 함께 다른 예제와 함께 직접 할 것입니다. 의견이나 의견 등을 자유롭게 적어 의견을 보내 주시기 바랍니다.
polygenelubricants 2016 년


4
이 답변은 Stack Overflow Regular Expression FAQ의 "Quantifiers> More on the difference ..."에 추가되었습니다
aliteralmind

이 답변은 실제로 선택한 답변이 될 가치가 있습니다!. 자세한 설명 감사합니다.
masky007

태그가 아닌 욕심을 추가했습니다 . 그 이유는 질문에 필요한 것이 아니라 더 많은 사용자를이 훌륭한 답변으로 끌어 들이기 때문입니다. 즉, 훌륭한 답변을 제공하고 답변에 질문에없는 태그를 사용하는 경우 OP가 태그의 관련성을 알지 못했기 때문에 태그를 추가합니다.
Guy Coder

20

가지고 있다고 가정 해 봅시다.

<a></a>

<(.*)>일치하는 a></a위치와 <(.*?)>일치 a합니다. 후자는의 첫 번째 경기 후에 멈 춥니 다 >. .*다음 표현식이 하나 이상 일치하는지 확인합니다 .

첫 번째 표현식 <(.*)>은 첫 번째 표현식과 일치 할 때 멈추지 않습니다 >. 의 마지막 일치까지 계속됩니다 >.


위의 설명보다 이해하기 쉽습니다.
프로 메테우스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.