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

mar*_*osh 5 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.
Run Code Online (Sandbox Code Playgroud)

我需要#{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);
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 3

假设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.
Run Code Online (Sandbox Code Playgroud)