带有[\ d] *的String.replaceAll()在字符之间附加替换字符串,为什么?

时间:2013-08-07 15:01:34

标签: java regex

我现在已经尝试了几个小时来获得一个与未知数量的连续数字相匹配的正则表达式语句。我相信[0-9] *或[\ d] *应该是我想要的,当我使用Java的String.replaceAll时,它将我的替换字符串添加到不应该与正则表达式匹配的位置。

例如: 我有一个输入字符串“这是my99String问题” 如果我的替换字符串是“〜”

当我运行时

myString.replaceAll("[\\d]*", "~" )

myString.replaceAll("[0-9]*", "~" )

我的返回字符串是“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 〜E〜米〜“

正如您所看到的那样,数字已被替换,但为什么它还会在字符之间附加我的替换字符串。

我希望它看起来像“这是我的〜字符串问题”

我做错了什么,为什么java匹配这样。

2 个答案:

答案 0 :(得分:9)

\\d*匹配0位或更多位数,因此它甚至匹配空字符串。并且在字符串中的每个字符之前都有一个空字符串。因此,对于它们中的每一个,它将其替换为~,因此结果为。

请尝试使用\\d+。而且您不需要在字符类中包含\\d

答案 1 :(得分:1)

[\\d]*

匹配零或更多(由*定义)。因此,你通过你的字符串获得匹配。如果你使用

[\\d]+

这将匹配1个或更多数字。

来自the doc

Greedy quantifiers
X?  X, once or not at all
X*  X, zero or more times
X+  X, one or more times