我的文字包含多个#{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
为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);
答案 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);
希望这有帮助!