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

Posted

技术标签:

【中文标题】如何确保 replaceAll 将替换整个单词而不是子字符串【英文标题】:How to ensure replaceAll will replace a whole word and not a subString 【发布时间】:2014-11-02 12:05:52 【问题描述】:

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

 

【问题讨论】:

您是否尝试在替换之前检查equal 的元素? 我没有得到这个问题..你所说的平等是什么意思???我正在使用整个文本来替换它并且没有标记它.. 【参考方案1】:

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

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

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

我建议这样做:

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

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

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

【讨论】:

我使用 Pattern.quote 来保持特殊字符的完整性。但即使这样也行不通。我也试过 \\b .. 它不起作用 @user2832203 请在您的问题中写下不起作用的代码。【参考方案2】:

"\bword\b" 对我有用。

示例代码:

for (row <- df.rdd.collect)   
var config_key = row.mkString(",").split(",")(0)
var config_value = row.mkString(",").split(",")(1)
val rc_applied_hiveQuery="select * from emp_details_Spark2 where empid_details= 'empid' limit 10"
var str_row = rc_applied_hiveQuery.replaceAll("\\b"+config_key+"\\b", "xyz")
println(str_row)

输出:select * from emp_details_Spark2 where empid_details= '5' limit 10

【讨论】:

以上是关于如何确保 replaceAll 将替换整个单词而不是子字符串的主要内容,如果未能解决你的问题,请参考以下文章

替换 HTML 页面上所有出现的子字符串而不使用 replaceAll 并将大小写保持为原始

使用String replaceAll在某些字符前面时如何不替换

在查找/替换中使用ReplaceAll,但删除源格式

使用scanner类更改文本文件中的特定文本(java)

如何替换光标下的单个单词?

仅在 Lua 中使用正则表达式替换整个单词