Java matcher, как динамически заменять группы в зависимости от их значения - PullRequest
0 голосов
/ 14 мая 2018

Для быстрой выборки у меня есть следующая строка:

String s = "hey.there.man.${a.a}crazy$carl${a.b}jones

У меня также есть следующий метод:

private String resolveMatchedValue(String s) {
    if(s.equals("a.a")) {
           return "A";
    else if(s.equals("a.b")) { 
           return "Wallet";
    else if(.....
    ....
 }

Мой шаблон будет

 Pattern pattern = Pattern.compile("\\$\\{(.*?)\\}");

Так что для каждой подстроки в s, которая соответствует $ {. *}, Я хочу, чтобы был вызов метода resolMatchedValue, и он должен быть заменен этим.Поэтому в идеале после того, как процесс регулярного выражения должен быть

 s = "hey.there.man.Acrazy$carl$Walletjones

, я смотрел на похожие решения, но ничего, что динамически заменяет сопоставленные значения на основе сопоставленного значения, и не смог заставить его работать

редактировать: используя java8

1 Ответ

0 голосов
/ 14 мая 2018

Чтобы получить только правильные символы, вы должны исключить правую фигурную скобку из вашей группы [^}]+.На самом деле, лучше просто включить конкретный шаблон, который вы ищете, для раннего обнаружения ошибок:

Pattern pattern = Pattern.compile("\\$\\{([a-z]\\.[a-z]+)\\}");

Метод Matcher.replaceAll​(Function<MatchResult,String> replacer) предназначен для выполнения именно того, что вы запрашиваете.Функция, переданная методу, получает каждое совпадение и возвращает строку для ее замены.

В вашем случае:

pattern.matcher(input).replaceAll(mr -> resolveMatchedValue(mr.group(1)));

Возвращает строку, в которой все подстроки соответствуют вашему шаблону.

Вот рабочий пример, который только заглавные буквы полей:

System.out.println(Pattern.compile("\\$\\{([[a-z]\\.[a-z])\\}")
    .matcher("hey.there.man.${a.a}crazy$carl${a.b}jones")
    .replaceAll(mr -> mr.group(1).toUpperCase()));

До Java 9 эквивалент:

StringBuffer result = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(result, resolvedMatchedValue(matcher.group(1)));
}
matcher.appendTail(result);

После чего result.toString()содержит новую строку.

...