我一直在努力解决这个问题。我有一个有模式的字符串。例如。
CW1234 has been despatched to CW334545
即字符串可以有以 CW
开头的模式,后跟任意数量的整数(最多 16
)。
我想用一个空字符替换所有这些模式。这样字符串看起来像
has been despatched to
我尝试了以下方法,但它只替换了 CW 后面的第一个数字。我对java很陌生。任何见解都会有很大帮助。
if(Pattern.matches(".*[C][W][0-9].*", str1)) {
Matcher m = Pattern.compile(".*[C][W][0-9].*").matcher(str1);
while(m.find()) {
str1 = str1.replaceAll("[C][W][0-9]", "");
}
}
System.out.println(str1);
最佳答案
您需要在数字上使用 {n,m}
量词,以强制最大数字。此外,为了更换目的,您无需事先检查图案是否存在。 replaceAll
仅当存在匹配模式时才会替换,否则将保持原样。
因此,删除所有那些 Pattern
和 Matcher
部分,并将您的正则表达式更改为:
str1 = str1.replaceAll("CW\\d{0,16}", "");
如果您想要至少 1 位数字,则将其设为 {1,16}
。无需将 C
和 W
放在不同的字符类中。具有单个字符的字符类与该字符本身一样好(假设它不是特殊字符)。此外,您可以使用 \\d
而不是 [0-9]
。
关于java - 替换字符串中正则表达式匹配的空白区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18954476/