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)