これら2つの用語は、わかりやすい方法で何ですか?
12 に答える
グリーディは可能な限り消費します。http://www.regular-expressions.info/repeat.htmlから、HTML タグを<.+>
. 次のものがあるとします。
<em>Hello World</em>
<.+>
(改行文字以外の文字を.
意味し、 1 つ以上のを意味する) は、実際には非常に貪欲で、最初から最後の. これは、あなたが望んでいたものではなく、一致することを意味します。+
<em>
</em>
<
>
<em>Hello World</em>
遅延 ( <.+?>
) にすると、これを防ぐことができます。?
の後にを追加することで、できるだけ少ない回数+
繰り返すように指示します。そのため、最初に遭遇した場所でマッチングを停止します。>
正規表現の探索に役立つ優れたツールであるRegExrをダウンロードすることをお勧めします。私は常にこのツールを使用しています。
「Greedy」は、可能な限り長い文字列に一致することを意味します。
「Lazy」は、可能な限り短い文字列に一致することを意味します。
たとえば、貪欲は in にh.+l
一致'hell'
します'hello'
が、怠惰はにh.+?l
一致し'hel'
ます。
貪欲な数量詞 | 遅延量指定子 | 説明 |
---|---|---|
* |
*? |
スター数量詞: 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
貪欲は、式が可能な限り大きなグループに一致することを意味し、遅延は、可能な限り最小のグループに一致することを意味します。この文字列の場合:
abcdefghijklmc
そしてこの表現:
a.*c
貪欲な一致は文字列全体に一致し、遅延一致は最初のabc
.
私の知る限り、ほとんどの正規表現エンジンはデフォルトで貪欲です。量指定子の最後に疑問符を追加すると、遅延一致が有効になります。
@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
正規表現から
正規表現の標準量指定子は貪欲です。つまり、可能な限り一致し、残りの正規表現と一致するために必要な分だけ返します。
遅延量指定子を使用することにより、式は最初に最小一致を試みます。