【发布时间】:2026-01-20 00:10:01
【问题描述】:
来自 GLib 参考手册,"Regular expression syntax" 部分,“原子分组和所有格量词”小节:
考虑将模式
\d+foo应用于字符串123456bar:在匹配所有6位数字然后未能匹配“foo”后,匹配器的正常操作是再次尝试仅匹配\d+的5位数字item,然后是 4,依此类推,最终失败。如果我们在前面的示例中使用
(?>\d+)foo(称为原子分组),匹配器会在第一次未能匹配“foo”时立即放弃。当原子组的子模式只是单个重复项时,如上例所示,可以使用更简单的符号,称为“占有量词”:
\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)
【问题讨论】:
-
您的意思是
star运算符而不是start?\d*这里*匹配\d,然后你有另一个*不匹配。如果你使用.*,那么它将匹配任何字符任意次数(如果我没记错的话,.匹配除\n之外的所有字符,并且可能会匹配其他字符)。
标签: java regex quantifiers