如何检查包含多个模式的字符串并替换该模式

时间:2014-06-16 06:24:51

标签: java


我尝试检查包含某些模式的字符串,并且我想替换该模式。我将该模式存储在ArrayList中。这就是我所做的:

public static void main(String args[]){
    ArrayList<String> pattern = new ArrayList<String>();
    pattern.add("pattern1");
    pattern.add("pattern2");
    pattern.add("pattern3");
    pattern.add("pattern4");
    pattern.add("pattern10");
    pattern.add("pattern20");

    ArrayList<String> replace = new ArrayList<String>();
    replace.add("(*pattern1*)");
    replace.add("(*pattern2*)");
    replace.add("(*pattern3*)");
    replace.add("(*pattern4*)");
    replace.add("(*pattern10*)");
    replace.add("(*pattern20*)");

    String sentence = "some sentence pattern1 and pattern10 or pattern20";

    for(int i = 0; i < pattern.size(); i++){
        if(sentence.contains(pattern.get(i))){
            sentence = sentence.replace(pattern.get(i), replace.get(i));
        }
    }
    System.out.println(sentence);
}

上面的代码不能替换我的所有模式。结果是

some sentence (*pattern1*) and (*pattern1*)0 or (*pattern2*)0

结果不是我的预期。我期待这样的事情

some sentence (*pattern1*) and (*pattern10*) or (*pattern20*)

有人可以帮我检查所有模式的字符串,而不是替换模式吗?

3 个答案:

答案 0 :(得分:2)

您应该在pattern10之前检查pattern1,因为pattern1也会更改pattern10 ...

在此解决方案中,您需要验证没有目标模式(您替换的内容)包含源模式(您替换的内容),否则某些目标模式也将被更改。

另一个解决方案是在每个String的末尾添加空格,但是你需要(临时)在句子的末尾添加另一个空格。

答案 1 :(得分:0)

您可以使用数字匹配和分组来简化:

public static void main(final String args[]) {
    final String sentence = "some sentence pattern1 and pattern10 or pattern20";
    System.out.println(sentence.replaceAll("pattern([\\d]*)", "(*pattern$1*)"));
}

答案 2 :(得分:0)

只需将您的for循环更改为此,您的程序即可运行。

for(int i = 0; i < pattern.size(); i++){
    Pattern pat = Pattern.compile(pattern.get(i)+"(?:\\W|$)");
    Matcher m = pat.matcher(sentence);
    if(m.find()){
        sentence = sentence.replaceAll(m.group(), replace.get(i));
    }
}