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

Java 如何检查包含多个模式的字符串并替换该模式,java,Java,我试图检查包含一些模式的字符串,我想替换该模式。我将该模式存储在ArrayList中。以下是我所做的: public static void main(String args[]){ ArrayList<String> pattern = new ArrayList<String>(); pattern.add("pattern1"); pattern.add("pattern2"); pattern.add("pattern3");


我试图检查包含一些模式的字符串,我想替换该模式。我将该模式存储在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 (*pattern10*) or (*pattern20*)

有人能帮我检查带所有图案的字符串,然后替换图案吗?

您应该在
图案1
之前检查
图案10
,因为
图案1
也会改变
图案10

在这个解决方案中,您需要验证没有目标模式(您所替换的)包含源模式(您所替换的),否则一些目标模式也将被更改


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

您可以通过数字匹配和分组来简化:

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*)"));
}

只要将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));
    }
}
for(int i=0;i
谢谢@BobTheBuilder所以我需要做的是,当我试图检查句子是否包含模式时,反转循环?你应该确保按正确的顺序检查字符串。代码也和你编程时一样…谢谢,伙计,如果我在所有字符串后面加上空格,它就可以工作了。。谢谢,这仍然不起作用,因为
模式1
包含在
(*pattern10*)
中。结果会更糟。@shmosel为什么?添加空格将导致它们不同。代码完全按照您的要求执行。如果希望得到不同的结果,则需要定义更详细的模式,可能需要使用正则表达式。
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));
    }
}