exapl 我有具体情况。我想替换字符串中的一些单词。我有两个示例字符串:
string1 = "aaabbb aaa bbb"
string2 = "a. bbb"
在string1中我想用“ccc”替换完整的单词“aaa”,所以我这样做:
translation = "aaa"
string1.gsub(/\b#{translation}\b/, "ccc") => "aaabbb ccc bbb"
所以它很有效,我很高兴,但当我尝试更换“a”时。用“aaa”它不起作用,它返回string2。
我也尝试了这个:
translation = "a."
string2.gsub(translation, "aaa") => "aaa bbb"
但是当我使用gsub上面的string1时,我得到了“cccbbb ccc bbb”。对不起马英语,但我希望我解释它有点可以理解。谢谢你的所有答案。
答案 0 :(得分:2)
尝试
string1.gsub(/\b#{Regexp.escape(translation)}\b/, "ccc")
正则表达式'.'
表示“任何字符”。通过致电escape
,您将'a.'
转为'a\.'
,这意味着“a,然后是句点字符”。
<强>更新强>
正如@Daniel在评论中指出的那样,单词边界有一些subtleties。因此,要使上述内容与"a."
一起使用,您需要将\b
替换为预见和后视:
string1.gsub(/(?<!\w)#{Regexp.escape(translation)}(?!\w)/, "ccc")
# => "ccc bbb"
答案 1 :(得分:1)
由于\w
排除了点,我想OP想要包含在令牌字符之间,我建议使用白名单外观方法:
string = "a. b.a. a. bbb"
translation = "a."
# Using !\w b.a. is not considered as a single token
string.gsub(/(?<!\w)#{Regexp.escape(translation)}(?!\w)/, "ccc")
# Notice b.ccc
#=> "ccc b.ccc ccc bbb"
# Using \s b.a. is considered as a single token
string.gsub(/(?<=^|\s)#{Regexp.escape(translation)}(?=\s|$)/, "ccc")
# Notice b.a.
#=> "ccc b.a. ccc bbb"
无论如何,我推理的正确性取决于OP的需要; - )
答案 2 :(得分:0)
.
(点)在正则表达式中有特殊含义:它表示匹配任何字符。
您应该使用\.