sp0*_*00m 1 java regex quantifiers
从GLib参考手册的"正则表达式语法"部分,"原子分组和所有格量词"小节:
\d+foo在应用于字符串时考虑模式123456bar:在匹配所有6位数然后未匹配"foo"之后,匹配器的正常操作是再次尝试仅匹配\ d +项目的5位数,然后使用4,等等在最终失败之前.如果我们使用
(?>\d+)foo(称为原子分组)前一个例子,匹配器会在第一次未能匹配"foo"时立即放弃.当原子组的子模式只是一个重复项时,如上例所示,可以使用更简单的表示法,称为"占有量词":
\d++foo
我的问题是:有没有理由为什么star(*)重复运算符没有等价物?
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
Run Code Online (Sandbox Code Playgroud)
异常堆栈跟踪是:
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)
Run Code Online (Sandbox Code Playgroud)
你可以添加+任何东西来制作占有量量词(它不是"量化器的倍增").所以
System.out.println(in.matches("\\d*+"));
Run Code Online (Sandbox Code Playgroud)