正则表达式:星重复运算符的占有量词,即\ d **

时间:2013-04-24 12:58:52

标签: java regex quantifiers

从GLib参考手册的"Regular expression syntax"部分,“原子分组和占有量词”小节:

  

在应用于字符串\d+foo时考虑模式123456bar:在匹配所有6位数然后未匹配“foo”之后,匹配器的正常操作是仅使用5位数再次尝试匹配\ d +项目,然后匹配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)

1 个答案:

答案 0 :(得分:5)

你可以将+添加到任何东西以制作占有量词(它不是“量化器的倍增”)。所以

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