1

我一直在努力解决这个问题。我有一个有模式的字符串。例如。

CW1234 has been despatched to CW334545 

即字符串可以有CW以任意数量的整数开头的模式(在 max 处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);
4

5 回答 5

3

你需要{n,m}在你的数字上有量词,以强制执行最大数字。此外,出于替换目的,您无需事先检查图案是否存在。replaceAll仅当存在匹配模式时才会替换,否则将保留字符串原样。

因此,删除所有这些PatternMatcher部分,并将您的正则表达式更改为:

str1 = str1.replaceAll("CW\\d{0,16}", "");

如果您想要至少 1 位数字,请制作{1,16}. 无需将CW放在不同的字符类中。具有单个字符的字符类与该字符本身一样好(假设它不是特殊字符)。此外,您可以使用\\d而不是[0-9].

于 2013-09-23T08:12:14.003 回答
2

您不必要地构建模式并多次匹配字符串。

str1 = str1.replaceAll("CW\\d+", "");

这已经足够了。所有其他代码都是多余的。

如果性能有问题,您也可以选择手动更换。

于 2013-09-23T08:14:50.480 回答
1

replaceAll缺少一个+

str1 = str1.replaceAll("[C][W][0-9]+", "");

+将使正则表达式匹配直接跟随的任意数量的数字CW

于 2013-09-23T08:09:40.760 回答
1

你的正则表达式是错误的。尝试:

 String str1 = CW1234;
 str1 = str1.replaceAll("\\bCW\\d{0,16}\\b","");

如果“CW12134”是字符串中的单个标记或

 String str1 = CW1234;
 str1 = str1.replaceAll("^CW\\d{0,16}$","");

如果“CW1234”是一个完整的字符串。

于 2013-09-23T08:16:08.567 回答
1

String.replaceAll("CW[0-9\\s]*", "")做你需要的,它还删除了数字末尾的空格。

另一方面,Pattern.compile() 的全部意义在于您需要在应用程序中编译一次所需的表达式,然后使用匹配器查找出现。所以我认为你的用法不合适(而不是不正确)。 Pattern pattern = Pattern.compile("CD[0-9\\s]*");在代码中只出现一次,然后将其重用为 Matcher matcher = pattern.matcher(stringToMatch);

于 2013-09-23T08:33:13.420 回答