2016-11-09 2 views
0

Мне хотелось бы получить входную строку String, перебрать каждую подстроку этой строки, которая содержит шаблон, а затем применить к этим подстрокам другой шаблон и каким-то образом заменить эту часть. Это код:Iterate Matcher Regex Java

public static String parseLinkCell1NoLost(String cell) { 

    String link = cell; 
    Pattern catPattern = Pattern.compile("\\{\\{(.*?)\\}\\}", Pattern.MULTILINE); 
    Matcher matcher = catPattern.matcher(cell); 
    while (matcher.find()) { 
     Pattern newP = Pattern.compile("\\{\\{nowrap|(.*?)\\}\\}", Pattern.MULTILINE); 
     Matcher m = newP.matcher(cell); 

     if (m.matches()) { 
      String rest = m.group(0); 
      String prov = m.group(1); 
      String[] temp = prov.split("\\|"); 
      if (temp == null || temp.length == 0) { 
       return link; 
      } else { 
       link = link.replace(rest, temp[1]); 
      } 
     } 

    } 
    return link; 
} 

Проблема заключается в том, что я не могу получить подстроку, которая соответствует каждому matcher.find(). Так что, если у меня есть вход "{{nowrap|x}} {{nowrap|y}}", я хотел бы повторить итерацию два раза и получить подстроку {{nowrap|x}} в первую очередь, а {{nowrap|y}} во втором. Спасибо заранее.

+0

N o это нехорошо, я должен применить другой шаблон newP к каждой подстроке. –

+0

Извините, я не понимаю, что вы делаете. Шаблон newP содержит избыточную 'Pattern.MULTILINE' (вы можете удалить ее) и unescaped' | ', который создает чередование *. '\\ {\\ {nowrap | (. *?) \\} \\}' соответствует либо '{{nowrap', либо любым символам 0+, отличным от строк, а затем'}} '. Вы хотели уйти от '' '? Что такое вывод для '' {{nowrap | x}} {{nowrap | y}} "'? –

+0

Хорошо, сначала я проверяю каждую подстроку с помощью {{...}}, а затем внутри проверки другого регулярного выражения, например {{nowrap | ...}} или {{birthday | 16 | 09 | 1991} }, и обрабатывать их правильно. –

ответ

1
public static String parseLinkCell1NoLost(String cell) { 
    String link = cell; 
    Pattern catPattern = Pattern.compile("\\{\\{(.*?)\\}\\}", Pattern.MULTILINE); 
    Matcher matcher = catPattern.matcher(cell); 
    while (matcher.find()) { 
     Pattern newP = Pattern.compile("\\{\\{nowrap\\|(.*?)\\}\\}", Pattern.MULTILINE); 
     Matcher m = newP.matcher(matcher.group(0)); 

     if (m.matches()) { 
      String rest = m.group(0); 
      String prov = m.group(1); 
      link = link.replace(rest, prov); 
     } 
    } 
    return link; 
} 

Две маленькие ошибки:

  • в цикле, вы должны использовать matcher.group(0) только использовать ваш матч не все ячейки в каждой итерации
  • вам нужно, чтобы избежать | символ в регулярном выражении
  • один раз, который исправлен replace(..) также может быть удален
+0

[demo] (http://ideone.com/fLgdJ6) подхода. –

Смежные вопросы