如何替换字符串中的所有#{key}?

时间:2011-11-28 09:18:31

标签: java regex

我的文字包含多个#{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)messageSourceorg.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 个答案:

答案 0 :(得分:3)

假设key只是任何名称的占位符,您的正则表达式将是这样的:#\{([\w\.]+)\}

这意味着:\w\.a-zA-Z0-9_\.之间的任何单词字符或点(#{)的序列都将作为第1组返回。

现在你需要创建一个匹配器并迭代匹配,提取密钥并将匹配替换为你的消息:

}

答案 1 :(得分:2)

尝试使用此正则表达式:

#{([^}]+)}

答案 2 :(得分:0)

使用yourString.replaceAll("\\#\\{key\\}", messageSource.getMessage(key, null, locale))

第一个反斜杠是从java的字符串解释中逃脱第二个反斜杠。第二个用于转义正则表达式解释的'#'符号(或'{','}'符号)。

答案 3 :(得分:0)

你走了。工作示例:

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

希望这有帮助!