"
*
"和"**
"有什么区别?为什么在使用"pattern.compile(".**");
"时".**
"不能编译通过?"*
"和"**
"有什么区别?为什么在使用"pattern.compile(".**");
"时".**
"不能编译通过?"在评估正则表达式时,*
是一个元字符,表示前面的字符出现0次或多次。
当你写.**
时,它会分解为.*
(表示0个或多个任意字符)后跟*
,其中没有前导字符,因此该模式无法编译。
.
表示“(几乎)任何字符”。
*
表示“匹配前一个字符0次或多次”。
第二个 *
在此上下文中没有任何意义。
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正则表达式测试器中)。
*
或**
请求。这两者之间有什么区别? - Squeez(?s)^.*$
。如果您允许使用*
来检索某些内容,则它不再是正则表达式,而是一个通配符。 - Wiktor Stribiżew*
和 **
有什么区别? - Squeez**
的意思是 获取所有内容,然后获取剩下的所有内容。这没有多少意义,对吧?第二个 *
不匹配任何东西。但这是模式匹配,不是基于正则表达式的。 - Wiktor Stribiżew*
是通配符,它将匹配任何字符串中的0个或多个字符。当您请求所有内容时,您仍然只会得到所有内容,而不是所有内容的两倍,对吧? :) - Wiktor Stribiżew*
在正则表达式中是一个量词,如果您想使用它而不带任何特殊意义,请转义它 \*
。
.*
- 将匹配任何单个字符,但不是换行符(换行、回车、下一行、行分隔符、段落分隔符) .*
出现零次或多次,尽可能多地匹配,必要时回溯(贪婪模式)*
您的正则表达式可能会找到零长度匹配。Java 8允许在先前匹配结束的位置上进行零长度匹配。
.**
”,你认为第二个“*”应该被应用于什么? - azurefrog*
和**
有些困惑。所以我在这里问一下。 - Squeez