*和**的区别

时间:2016-05-02 20:43:33

标签: java regex pattern-matching

***之间有什么区别?使用.**时为什么pattern.compile(".**");没有编译?

4 个答案:

答案 0 :(得分:2)

在评估正则表达式时,*是一个元字符,表示前面的字符出现0次或更多次。

当您编写.**时,会分解为.*(表示0或更多任何字符),后跟*,其中没有前面的字符,因此模式可以& #39; t compile。

答案 1 :(得分:2)

.表示“(差不多)任何字符”。

*表示“匹配前一个字符0次或更多次”

第二个*在这种情况下没有任何意义。

答案 2 :(得分:2)

请参阅Java Quantifiers参考:

Greedy  Reluctant   Possessive  Meaning
X?      X??         X?+         X, once or not at all
X*      X*?         X*+         X, zero or more times
X+      X+?         X++         X, one or more times
X{n}    X{n}?       X{n}+       X, exactly n times
X{n,}   X{n,}?      X{n,}+      X, at least n times
X{n,m}  X{n,m}?     X{n,m}+     X, at least n but not more than m times

没有**量词。在++*(或甚至?)之后使用{n,m}时,您可以创建所有格量词(请参阅上表),但在*后添加*量词会被视为用户错误

这就是为什么.*会匹配除换行符之外的0 +个字符(没有Pattern.DOTALL修饰符)而.**会抛出异常的原因。

请注意,在线正则表达式测试人员还会警告您此问题:Dangling meta character '*' near index 2 .** ^(同一警告显示在OCPSoft regex tester)。

答案 3 :(得分:1)

正则表达式中的

\* quantifier ,如果您想使用它而没有任何特殊含义,请将其.*转义。

.* - 将匹配任何单个字符 换行符(换行符,回车符,下一行,行分隔符,段落分隔符) )* 在零和无限次之间尽可能多次,根据需要返回(贪婪){{1}}您的正则表达式可以找到零长度匹配 Java 8允许在前一个匹配结束的位置进行零长度匹配。