Java的replaceAll()方法中的正则表达式元字符“*”和“*?”行为奇怪
而
"a".replaceAll("a", "b")
"a".replaceAll("a+", "b")
"a".replaceAll("a+?", "b")
都回来了,为什么b
"a".replaceAll("a*", "b")
返回和bb
"a".replaceAll("a*?", "b")
返回?bab
而
"a".replaceAll("a", "b")
"a".replaceAll("a+", "b")
"a".replaceAll("a+?", "b")
都回来了,为什么b
"a".replaceAll("a*", "b")
返回和bb
"a".replaceAll("a*?", "b")
返回?bab
"a".replaceAll("a*", "b")
首先替换为 ,然后将指针前进到 .然后,它与字符串的末尾匹配,并替换为 。由于它与空字符串匹配,因此它会前进指针,从字符串中掉出并完成,从而得到 .a
b
b
b
bb
"a".replaceAll("a*?", "b")
first 匹配字符串的开头并替换为 。它与 因为 in 表示“不贪婪”(尽可能少地匹配)不匹配。由于它与空字符串匹配,因此它会前进指针,跳过 。然后,它与字符串的末尾匹配,替换为字符串并退出字符串,从而得到 .最终结果与您所做的相同。b
a
?
a*?
a
b
bab
"a".replaceAll("", "b")
发生这种情况是因为零宽度匹配。
"a".replaceAll("a*", "b")
将匹配两次:
*
a
前进到字符串中的下一个位置(现在在字符串末尾),尝试匹配,空字符串匹配。
" a "
\| \___ 2. match empty string
\_____ 1. match "a"
"a".replaceAll("a*?", "b")
还将匹配两次:
*?
a
前进到字符串中的下一个位置(现在在字符串的末尾),尝试匹配那里,空字符串匹配。
" a "
\ \___ 2. match empty string
\_____ 1. match empty string