[regex] 정규 표현식의 맥락에서 ‘게으른’과 ‘욕심쟁이’는 무엇을 의미합니까?

누군가이 두 용어를 이해할 수있는 방식으로 설명 할 수 있습니까?



답변

탐욕은 가능한 한 많이 소비 할 것입니다. 에서 http://www.regular-expressions.info/repeat.html 우리는 함께 HTML 태그를 일치하도록 노력의 예를 참조하십시오 <.+>. 다음이 있다고 가정하십시오.

<em>Hello World</em>

당신은 그 생각 <.+>( .수단 이 아닌 개행 문자+수단 중 하나 이상 )에만 일치합니다 <em>과를 </em>현실에 매우 욕심 때, 첫 번째에서 이동 <마지막에 >. 이것은 <em>Hello World</em>당신이 원하는 것이 아니라 일치한다는 것을 의미합니다 .

게으 르면 ( <.+?>) 이것을 방지 할 수 있습니다. ?이후 에을 추가하면 가능한 한 몇 번+ 반복하도록 지시 하므로 처음 으로 나타나는 부분은 일치를 중지하려는 위치입니다.>

정규식을 탐색하는 데 도움이되는 훌륭한 도구 인 RegExr 을 다운로드하는 것이 좋습니다 . 항상 사용합니다.


답변

‘Greedy’ 는 가능한 가장 긴 문자열과 일치 함을 의미합니다.

‘게으른’ 은 가능한 가장 짧은 문자열과 일치 함을 의미합니다.

예를 들어, 욕심 h.+l경기 'hell'에서 'hello'하지만 게으른 h.+?l경기 'hel'.


답변

+-------------------+-----------------+------------------------------+
| Greedy quantifier | Lazy quantifier |        Description           |
+-------------------+-----------------+------------------------------+
| *                 | *?              | Star Quantifier: 0 or more   |
| +                 | +?              | Plus Quantifier: 1 or more   |
| ?                 | ??              | Optional Quantifier: 0 or 1  |
| {n}               | {n}?            | Quantifier: exactly n        |
| {n,}              | {n,}?           | Quantifier: n or more        |
| {n,m}             | {n,m}?          | Quantifier: between n and m  |
+-------------------+-----------------+------------------------------+

추가하다 ? 수량 자에게 불명예스러운 게으른.

예 :
테스트 문자열 : 유래
욕심 레그 식 : s.*o출력 : stackoverflo w
지연 레그 식 : s.*?o출력 : stacko verflow


답변

욕심은 표현이 가능한 한 큰 그룹과 일치한다는 것을 의미하고, 게으름은 가능한 가장 작은 그룹과 일치한다는 것을 의미합니다. 이 문자열의 경우 :

abcdefghijklmc

그리고이 표현은 :

a.*c

욕심 많은 경기는 전체 문자열과 일치하고 게으른 경기는 첫 번째 경기와 일치합니다 abc.


답변

내가 아는 한 대부분의 정규식 엔진은 기본적으로 욕심입니다. 수량 자 끝에 물음표를 추가하면 지연 일치가 활성화됩니다.

@Andre S가 의견에서 언급했듯이.

  • 탐욕 : 조건이 충족되지 않을 때까지 계속 검색하십시오.
  • 게으른 : 조건이 충족되면 검색을 중지합니다.

탐욕스럽고 게으른 것에 대해서는 아래의 예를 참조하십시오.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String args[]){
        String money = "100000000999";
        String greedyRegex = "100(0*)";
        Pattern pattern = Pattern.compile(greedyRegex);
        Matcher matcher = pattern.matcher(money);
        while(matcher.find()){
            System.out.println("I'm greeedy and I want " + matcher.group() + " dollars. This is the most I can get.");
        }

        String lazyRegex = "100(0*?)";
        pattern = Pattern.compile(lazyRegex);
        matcher = pattern.matcher(money);
        while(matcher.find()){
            System.out.println("I'm too lazy to get so much money, only " + matcher.group() + " dollars is enough for me");
        }
    }
}


결과는 다음과 같습니다.

I'm greeedy and I want 100000000 dollars. This is the most I can get.

I'm too lazy to get so much money, only 100 dollars is enough for me


답변

www.regular-expressions.info 에서 가져옴

Greediness : Greedy 한정자는 먼저 토큰을 가능한 한 여러 번 반복하려고 시도하고 전반적인 일치를 찾기 위해 엔진 역 추적에 따라 점차적으로 일치를 포기합니다.

게으름 : 게으른 수량자는 먼저 필요한만큼 토큰을 반복하고 엔진이 정규식을 통해 역 추적 할 때 전체 일치를 찾기 위해 점차적으로 일치를 확장합니다.


답변

에서 정규 표현식

정규 표현식의 표준 수량자는 욕심이 많으므로 가능한 한 많이 일치하므로 나머지 정규 표현식과 일치하는 데 필요한만큼만 제공합니다.

게으른 수량자를 사용하면식이 최소 일치를 먼저 시도합니다.