正则表达式中的“*”有什么作用?

8

我的Java源代码:

String result = "B123".replaceAll("B*","e");
System.out.println(result);

输出结果为:ee1e2e3e。为什么?
3个回答

21
“*”表示零个或多个前一个字符的匹配。因此,每个空字符串都将被替换为“e”。 您可能想使用“+”代替:

replaceAll("B+", "e")


99%正确……这是一种贪心搜索,因此如果它能匹配“B”,它就会匹配。否则,输出将为“eee1e2e3e”。 - user54650
“:” 可能是复制粘贴错误,提供的代码无法产生 “:” … - Anders Westrup
我认为“:”并不是输出的一部分。 - Daniel Schaffer
空字符串在哪里?像这样:" B 1 2 3 "? - JSON
正则表达式解析器将逐个字符地遍历您的字符串。在位置0,它将用'e'替换'B',在位置1,它将用'e'替换'',以此类推。 - Anders Westrup
是的,空字符串在每个字符之间,以及字符串的开头和结尾。 - Daniel Schaffer

7
你想在你的模式中使用这个:
B+

您的代码应该是这样的:
String result = "B123".replaceAll("B+","e");
System.out.println(result);

"*"代表“零个或多个”——而“零”包括B之前的所有内容,以及其他所有字符之间的任何内容。

在第一次尝试中,正则表达式匹配'B',而不是空字符串。然后,它从第一个匹配结束的位置开始,在每个位置上匹配空字符串。 - Alan Moore

1
我在一家大型科技公司工作了一个多月,修复了正则表达式中 *(扩展符)的一个错误。我们维护着一个鲜为人知的UNIX操作系统。我的脑袋几乎要爆炸了,因为它匹配到了字符遇到零次的情况。这可真是一个难以通过自己的重现来理解的难题。在某些情况下我们进行了双重替换。我想不出代码错在哪里,但是我能够添加代码来捕捉特殊(错误)情况并防止双重替换,而且没有破坏任何包含它的程序(包括sed和awk)。我很自豪能够解决这个错误,但如已经提到的,简单地使用“+”就可以解决问题啊!

是的,双重匹配确实很奇怪。在我学会注意它之前,它让我困扰了几次。如果可以的话,始终使用+而不是*,加1分。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接