我尝试检查包含某些模式的字符串,并且我想替换该模式。我将该模式存储在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*)
有人可以帮我检查所有模式的字符串,而不是替换模式吗?
答案 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));
}
}