【问题标题】:Regex: possessive quantifier for the star repetition operator, i.e. \d**正则表达式:星号重复运算符的所有格量词,即 \d**
【发布时间】: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


【解决方案1】:

您可以将+ 添加到任何内容以构成所有格量词(它不是“加倍量词”)。所以

System.out.println(in.matches("\\d*+"));

【讨论】:

  • 哦,我没这么看...谢谢:)
最近更新 更多