java - 如何确保 replaceAll 将替换整个单词而不是子字符串

标签 java regex replaceall

我有一个字典输入。迭代字典以替换文本中字典中的 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());

} 

最佳答案

replaceAll 将正则表达式作为参数。

在正则表达式中,你有 word boundaries : \b(在字符串文字中使用 \\b)。它们是确保您匹配的是单词而不是单词的一部分的最佳方式:"\\bword\\b"

但在您的情况下,您不能使用单词边界,因为您不是在寻找单词([69-3] 不是单词)。

我建议:

text=text.replaceAll("(?=\\W+|^)"+Pattern.quote("[69-3]")+"(?=\\W+|$)", ...

这个想法是匹配字符串结尾或不是单词的东西。不过,我不能确保这对您来说是正确的解决方案:必须在了解确切的完整用例的情况下调整这种模式。

请注意,如果您所有的键都遵循类似的模式,则可能有比遍历字典更好的解决方案,例如,您可以使用类似 "(?=\\W+|^)\\[\\d+\\-\\d+\\](?=\\W+|$)"

关于java - 如何确保 replaceAll 将替换整个单词而不是子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738342/

相关文章:

java - 如何在 Java 中更改 CLASSPATH?

java - 为什么hibernate中的Property API没有方法in(Criteria subselect)?

java - 用于解析简单的基于文本的数据文件的正则表达式

java - 正则表达式允许; JAVA 中至少 5 位数字并修剪前导/尾随分号

javascript - 无法根据预定义列表替换文本

java - 替换一个字符串,只要它后面没有跟在 java 中的另一个字符串吗?

java - 如何创建 XML header ?

javascript - 正则表达式 Javascript 数字逗号分隔 | > | >= <=

java - 从 .txt 文件中删除特殊字符会在 Java 中给出 `LRB` 、 `LSB` 、 `RSB` 、 `LRB` 、 `RRB` 等

java - 如何避免重复的随机数并在android中选择另一个随机数?