Ruby替换单词

时间:2014-05-09 09:12:41

标签: ruby string

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”。对不起马英语,但我希望我解释它有点可以理解。谢谢你的所有答案。

3 个答案:

答案 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)

.(点)在正则表达式中有特殊含义:它表示匹配任何字符。

您应该使用\.

将其转义