我输入了字典。迭代字典以从文本中的字典替换key
。但replaceAll
函数也会替换subString
。
如何确保它与整个单词匹配(整体而不是subString
)
String text= "Synthesis of 1-(2,6-dimethylbenzyl)-1H-indole-6-carboxylic acid [69-3] The titled compound (883 mg) sdvfshd[69-3]3456 as a white solid was prepared"
dictionary= {[69-3]=1-(2,6-dimethylbenzyl)-1H-indole-6-carboxylic acid }
for(Map.Entry<String, String> entry : dictionary.entrySet()){
text=text.replaceAll("\\b"+Pattern.quote(entry.getKey())+"\\b", entry.getValue());
}
答案 0 :(得分:7)
replaceAll
将正则表达式作为参数。
在正则表达式中,您有word boundaries:\b
(在字符串文字中使用\\b
)。它们是确保您匹配单词而不是单词的一部分的最佳方式:"\\bword\\b"
但是在你的情况下,你不能使用单词边界,因为你没有找一个单词([69-3]
不是一个单词)。
我建议:
text=text.replaceAll("(?=\\W+|^)"+Pattern.quote("[69-3]")+"(?=\\W+|$)", ...
这个想法是匹配字符串结尾或不是单词的东西。我无法确保这对您来说是正确的解决方案:必须根据确切的完整用例调整此类模式。
请注意,如果您的所有密钥都遵循类似的模式,那么可能有一个比迭代字典更好的解决方案,例如,您可以使用类似"(?=\\W+|^)\\[\\d+\\-\\d+\\](?=\\W+|$)"
的模式。
答案 1 :(得分:0)
“ \ bword \ b”为我工作。
示例代码:
NativeName
输出:从emp_details_Spark2选择*,其中empid_details ='5'限制10