String s = "xxx(000) 001";
System.out.println(s.replaceAll("A-Za-z", ""));
为什么打印xxx(000) 001
而不是(000) 001
从A-Z
和a-z
删除所有匹配项?
答案 0 :(得分:4)
您没有使用正确的正则表达式,您必须使用[a-zA-Z]
这样的s = s.replaceAll("[a-zA-Z]", "");
:
{{1}}
答案 1 :(得分:2)
除了@YCF_L提出的字符类之外,我还要使用量词:
s.replaceAll("[A-Za-z]+", "");
# ---^---
否则,需要多次调用内部替换功能
<小时/> 对于此示例,请考虑带有正则表达式aa123bb
的字符串[A-Za-z]
。正则表达式引擎从左到右扫描字符串,并找到与a
匹配的字符串(在字符类中)。报告此匹配并在我们的案例中替换为""
。然后评估下一个字符,这是另一个a
:报告并替换匹配。 1
,2
和3
未包含在我们的角色类中,但b
和b
确实包含在内。因此,总的来说,这个表达式内部引擎报告了四个匹配。
现在考虑像[A-Za-z]+
这样的量词:引擎在a
中找到aa123bb
但是贪婪并渴望找到另一个字符,在我们的例子中是另一个a
。它现在报告与aa
匹配,然后由""
替换。 1
,2
和3
未包含在我们的角色类中,因此引擎会保留原样。现在,引擎会找到b
和(贪婪)另一个b
(总共bb
)并报告并替换第二场比赛。
虽然结果是相同的(在我们的例子中是123
),但正则表达式引擎只需要使用量词而不是四个来回馈两个结果(并调用替换)。