#java
#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*)
Может кто-нибудь помочь мне проверить строку со всем шаблоном, а затем заменить шаблон?
Комментарии:
1. Код выполняет именно то, что вы ему сказали. Если вы хотите получить другие результаты, вам нужно будет определить более подробные шаблоны, возможно, с использованием регулярных выражений.
Ответ №1:
Вы должны проверить pattern10
до pattern1
, так как pattern1
это также изменится pattern10
…
В этом решении вам нужно убедиться, что ни один целевой шаблон (на который вы заменяете) не содержит исходного шаблона (который вы заменяете), в противном случае некоторые целевые шаблоны также будут изменены.
Другое решение — добавить пробел в конце каждой строки, но затем вам нужно (временно) добавить еще один пробел в конце предложения.
Комментарии:
1. Спасибо @BobTheBuilder Итак, что мне нужно сделать, это отменить цикл, когда я пытался проверить, содержит ли предложение шаблон?
2. Вы должны убедиться, что проверяете строки в правильном порядке. Код работает так же, как вы его программируете…
3. спасибо, чувак, это сработает, если я добавлю пробел после всей строки.. Спасибо
4. Это все равно не сработает, потому
pattern1
что содержится в(*pattern10*)
. Результаты будут еще хуже.5. @shmosel почему? добавление пробелов приведет к тому, что они будут разными.
Ответ №2:
Вы можете упростить это с помощью сопоставления цифр и группировки:
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*)"));
}
Ответ №3:
Просто измените цикл 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));
}
}