*
和**
之间有什么区别?使用.**
时为什么pattern.compile(".**");
没有编译?
答案 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允许在前一个匹配结束的位置进行零长度匹配。