Java 正则表达式:星重复运算符的所有格量词,即.\d**
来自GLib参考手册“原子分组和所有格量词”小节: 当应用于字符串Java 正则表达式:星重复运算符的所有格量词,即.\d**,java,regex,quantifiers,Java,Regex,Quantifiers,来自GLib参考手册“原子分组和所有格量词”小节: 当应用于字符串123456bar时,请考虑模式\d+foo:在匹配所有6位数字后,然后未能匹配“foo”,匹配器的正常操作是在最终失败之前,仅使用5位数字匹配\d+项,然后使用4位数字,依此类推 如果我们在前面的示例中使用(?>\d+)foo(称为原子分组),匹配器在第一次未能匹配“foo”时会立即放弃 当一个原子组的子模式只是一个重复的项时,如上面的示例所示,可以使用一种更简单的表示法,称为“所有格量词”:\d++foo 我的问题是:有没有任
123456bar
时,请考虑模式\d+foo
:在匹配所有6位数字后,然后未能匹配“foo”,匹配器的正常操作是在最终失败之前,仅使用5位数字匹配\d+项,然后使用4位数字,依此类推
如果我们在前面的示例中使用(?>\d+)foo
(称为原子分组),匹配器在第一次未能匹配“foo”时会立即放弃
当一个原子组的子模式只是一个重复的项时,如上面的示例所示,可以使用一种更简单的表示法,称为“所有格量词”:\d++foo
我的问题是:有没有任何原因可以解释为什么星(*
)重复操作符没有等价物
Java中的示例:
=“123456”中的最后一个字符串;
//“加”(+)
System.out.println(in.matches(\\d+);//真的
System.out.println(in.matches((?>\\d+));//真的
System.out.println(in.matches(\\d++);//真的
//“星”(*)
System.out.println(in.matches(\\d*);//真的
System.out.println(in.matches((?>\\d*));//真的
System.out.println(in.matches(\\d**));//例外
异常堆栈跟踪为:
线程“main”java.util.regex.PatternSyntaxException中的异常:在索引3附近悬空元字符“*”
\d**
^
位于java.util.regex.Pattern.error(Pattern.java:1713)
位于java.util.regex.Pattern.sequence(Pattern.java:1878)
位于java.util.regex.Pattern.expr(Pattern.java:1752)
位于java.util.regex.Pattern.compile(Pattern.java:1460)
Pattern.(Pattern.java:1133)
位于java.util.regex.Pattern.compile(Pattern.java:823)
位于java.util.regex.Pattern.matches(Pattern.java:928)
位于java.lang.String.matches(String.java:2090)
你可以将
+
添加到任何东西中,形成所有格量词(这不是“量词加倍”)。所以
你可以将
+
添加到任何东西中来生成所有格量词(这不是“双倍量词”)。所以
你是说
star
操作符而不是start
<代码>\d*这里的*
匹配\d
,然后您有另一个*
不匹配。如果您执行*
,则它将匹配任意字符任意次数(如果我回忆正确,
将匹配除\n
之外的所有字符,并且可能很少有其他内容)。您是指星型
运算符而不是开始
<代码>\d*这里的*
匹配\d
,然后您有另一个*
不匹配。如果你这样做,*
,那么它将匹配任意字符任意次数(如果我记得正确,
匹配除\n
之外的所有字符,并且可能很少有其他内容)。哦,我不是这样看的。。。谢谢:)哦,我不是那样看的。。。谢谢:)
System.out.println(in.matches("\\d*+"));