678

これら2つの用語は、わかりやすい方法で何ですか?

4

12 に答える 12

806

グリーディは可能な限り消費します。http://www.regular-expressions.info/repeat.htmlから、HTML タグを<.+>. 次のものがあるとします。

<em>Hello World</em>

<.+>(改行文字以外の文字.意味し、 1 つ以上のを意味する) は、実際には非常に貪欲で、最初から最後の. これは、あなたが望んでいたものではなく、一致することを意味します。+<em></em><><em>Hello World</em>

遅延 ( <.+?>) にすると、これを防ぐことができます。?の後にを追加することで、できるだけ少ない回数+繰り返すように指示します。そのため、最初に遭遇した場所でマッチングを停止します。>

正規表現の探索に役立つ優れたツールであるRegExrをダウンロードすることをお勧めします。私は常にこのツールを使用しています。

于 2010-02-20T06:22:32.030 に答える
388

「Greedy」は、可能な限り長い文字列に一致することを意味します。

「Lazy」は、可能な限り短い文字列に一致することを意味します。

たとえば、貪欲は in にh.+l一致'hell'します'hello'が、怠惰はにh.+?l一致し'hel'ます。

于 2010-02-20T06:19:41.160 に答える
198
貪欲な数量詞 遅延量指定子 説明
* *? スター数量詞: 0 以上
+ +? プラス数量詞: 1 以上
? ?? オプションの数量詞: 0 または 1
{n} {n}? 量指定子: 正確に n
{n,} {n,}? 数量詞: n 以上
{n,m} {n,m}? 数量詞: n と m の間

? を追加 欲張りでない、つまり怠惰にするために量指定子に。

例:
テスト文字列: stackoverflow
greedy reg 式:s.*o出力: stackoverflow
lazy reg 式:出力s.*?o: stacko verflow

于 2016-01-15T07:26:36.037 に答える
68

貪欲は、式が可能な限り大きなグループに一致することを意味し、遅延は、可能な限り最小のグループに一致することを意味します。この文字列の場合:

abcdefghijklmc

そしてこの表現:

a.*c

貪欲な一致は文字列全体に一致し、遅延一致は最初のabc.

于 2010-02-20T06:19:18.480 に答える
23

私の知る限り、ほとんどの正規表現エンジンはデフォルトで貪欲です。量指定子の最後に疑問符を追加すると、遅延一致が有効になります。

@Andre Sがコメントで述べたように。

  • Greedy: 条件が満たされないまで検索を続けます。
  • Lazy: 条件が満たされると検索を停止します。

貪欲と怠惰については、以下の例を参照してください。

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
于 2016-11-09T16:39:06.257 に答える
10

正規表現から

正規表現の標準量指定子は貪欲です。つまり、可能な限り一致し、残りの正規表現と一致するために必要な分だけ返します。

遅延量指定子を使用することにより、式は最初に最小一致を試みます。

于 2010-02-20T06:21:22.360 に答える