1

GLib リファレンス マニュアルの「正規表現の構文」セクション、サブセクション「原子グループ化と所有量指定子」から:

\d+foo文字列に適用されるパターンを考えてみましょう123456bar: 6 桁すべてに一致し、"foo" との一致に失敗した後、マッチャーの通常のアクションは、\d+ 項目に一致する 5 桁のみで再試行し、次に 4 で再試行することです。最終的に失敗する前に。

前の例で (アトミック グループ化(?>\d+)fooと呼ばれる)を使用すると、マッチャーは最初に "foo" の一致に失敗するとすぐにあきらめます。

上記の例のように、アトミック グループのサブパターンが 1 つの繰り返し項目である場合、「所有量指定子」と呼ばれるより単純な表記法を使用できます。\d++foo

*私の質問は次のとおりです。スター ( ) 繰り返し演算子に相当するものがない理由はありますか?

Java での例:

final String in = "123456";
// "plus" (+)
System.out.println(in.matches("\\d+"));     // true
System.out.println(in.matches("(?>\\d+)")); // true
System.out.println(in.matches("\\d++"));    // true
// "star" (*)
System.out.println(in.matches("\\d*"));     // true
System.out.println(in.matches("(?>\\d*)")); // true
System.out.println(in.matches("\\d**"));    // exception

例外スタック トレースは次のとおりです。

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 3
\d**
   ^
    at java.util.regex.Pattern.error(Pattern.java:1713)
    at java.util.regex.Pattern.sequence(Pattern.java:1878)
    at java.util.regex.Pattern.expr(Pattern.java:1752)
    at java.util.regex.Pattern.compile(Pattern.java:1460)
    at java.util.regex.Pattern.<init>(Pattern.java:1133)
    at java.util.regex.Pattern.compile(Pattern.java:823)
    at java.util.regex.Pattern.matches(Pattern.java:928)
    at java.lang.String.matches(String.java:2090)
4

1 に答える 1

5

何にでも追加+して、所有量指定子を作成できます (「量指定子を 2 倍にする」わけではありません)。そう

System.out.println(in.matches("\\d*+"));
于 2013-04-24T13:00:53.263 に答える