Как заменить все # {ключ} в строке? - PullRequest
5 голосов
/ 28 ноября 2011

У меня есть текст с несколькими #{key} фразами.Например:

Lorem ipsum dolor sit amet, consectetur adipisicing #{key1}. Proin nibh 
augue, suscipit a, scelerisque #{key1}, lacinia in, mi. Cras vel #{key2}. 
Etiam pellentesque aliquet tellus. Phasellus pharetra nulla ac diam. 
Quisque semper #{key3} at risus.

Мне нужно заменить все #{key} значения соответствующими messageSource.getMessage(key, null, locale) (messageSource is org.springframework.context.MessageSource ), но яне хорошо в регулярных выражениях.Как построить правильное регулярное выражение?

Примеры :

#{texts.appName} need to replace with messageSource.getMessage("texts.appName", null, locale);
#{my.company} need to replace with messageSource.getMessage("my.company", null, locale);

Ответы [ 4 ]

3 голосов
/ 28 ноября 2011

Предполагая, что key - это просто заполнитель для любого имени, которое бы вы использовали для регулярного выражения: #\{([\w\.]+)\}

Это означает: любая последовательность символов или точек слова (\w\., что эквивалентноa-zA-Z0-9_\.) между #{ и } возвращается как группа 1.

Теперь вам нужно создать сопоставление и выполнить итерации по совпадениям, извлечь ключ и заменить совпадение вашим сообщением:

String input = "Lorem ipsum dolor sit amet, consectetur adipisicing #{key1}. " +
   "Proin nibh augue, suscipit a, scelerisque #{key1}," + 
   "lacinia in, mi. Cras vel #{key2}. Etiam pellentesque aliquet tellus." + 
   " Phasellus pharetra nulla ac diam. Quisque semper #{key3} at risus.";
StringBuffer result = new StringBuffer();

Pattern p = Pattern.compile( "#\\{([\\w\\.]+)\\}" );
Matcher m = p.matcher( input );

while( m.find() ) {      
  //extract the message for key = m.group( 1 ) here
  //i'll just mark the found keys 
  m.appendReplacement( result,  "##" + m.group( 1 ) + "##" );      
}
m.appendTail( result );

System.out.println(result); //output: ... consectetur adipisicing ##key1## ...  etc.
2 голосов
/ 28 ноября 2011

Дайте этому регулярному выражению попытку:

#{([^}]+)}
0 голосов
/ 28 ноября 2011

Вот, пожалуйста. Рабочий пример:

Pattern p = Pattern.compile("\\Q#{\\E([^.]+)\\Q}\\E");
Matcher m = p.matcher(yourString);
Pattern tempPattern = Pattern.compile("([#{][^.]+[}])");
Matcher tempMatcher = tempPattern.matcher(yourString);


while( m.find() && tempMatcher.find() ) {      

    String textToReplace = messageSource.getMessage(m.group(1), null, locale);
    yourString = yourString.replace(tempMatcher.group(1), textToReplace);
}

System.out.println(yourString);

Надеюсь, это поможет!

0 голосов
/ 28 ноября 2011

Использование yourString.replaceAll("\\#\\{key\\}", messageSource.getMessage(key, null, locale))

Первый обратный слеш должен выходить из второго обратного слеша из интерпретации строки Java. Второе - экранирование знака «#» (или «{», «}») для интерпретации регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...