正则表达式不删除A-Z和a-z

时间:2017-12-09 09:14:13

标签: java regex

String s = "xxx(000) 001";
System.out.println(s.replaceAll("A-Za-z", ""));

为什么打印xxx(000) 001而不是(000) 001A-Za-z删除所有匹配项?

2 个答案:

答案 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:报告并替换匹配。 123未包含在我们的角色类中,但bb确实包含在内。因此,总的来说,这个表达式内部引擎报告了四个匹配。

现在考虑像[A-Za-z]+这样的量词:引擎在a中找到aa123bb但是贪婪并渴望找到另一个字符,在我们的例子中是另一个a。它现在报告与aa匹配,然后由""替换。 123未包含在我们的角色类中,因此引擎会保留原样。现在,引擎会找到b和(贪婪)另一个b(总共bb)并报告并替换第二场比赛。

虽然结果是相同的(在我们的例子中是123),但正则表达式引擎只需要使用量词而不是四个来回馈两个结果(并调用替换)。