Как проверить строку, содержащую более одного шаблона, и заменить этот шаблон

#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));
    }
}