【问题标题】:Ignoring a character along with word boundary in regex忽略正则表达式中的字符以及单词边界
【发布时间】:2011-02-23 12:37:08
【问题描述】:

我在 Ruby 中使用 gsub 使文本中的单词变为粗体。我正在使用单词边界,以免其他单词中的字母变粗,但我发现这会忽略后面有引号的单词。例如:

text.gsub(/#{word}\b/i, "<b>#{word}</b>")

text = "I said, 'look out below'"
word = below

在这种情况下,下面的单词不会加粗。有什么办法可以忽略某些字符以及单词边界?

【问题讨论】:

    标签: ruby regex gsub


    【解决方案1】:

    非常小心您的\b 边界。 Here’s why.

    【讨论】:

      【解决方案2】:

      Regexp.new 中的所有转义看起来都非常难看。您可以通过使用 Regexp 文字来大大简化它:

      word = 'below'
      text = "I said, 'look out below'"
      
      reg = /\b#{word}\b/i
      text.gsub!(reg, '<b>\0</b>')
      

      此外,您可以直接使用gsub! 的修饰符形式,除非该字符串在您未向我们显示的代码中的其他位置使用别名。最后,如果您在 gsub 调用中使用单引号字符串文字,则无需转义反斜杠。

      【讨论】:

        【解决方案3】:

        #{word} 语法不适用于正则表达式。请改用Regexp.new

        word = "below"
        text = "I said, 'look out below'"
        
        reg = Regexp.new("\\b#{word}\\b", true)
        text = text.gsub(reg, "<b>\\0</b>")
        

        请注意,使用 sting 时需要将\b 转义为\\b,否则会被解释为退格。如果word 可能包含特殊的正则表达式字符,请使用Regexp.escape 对其进行转义。

        此外,通过将字符串替换为&lt;b&gt;#{word}&lt;/b&gt;,您可以更改字符串的大小写:“BeloW”将被替换为“below”。 \0 通过替换找到的单词来纠正这个问题。另外,我在开头加了\\b,你不要找“day”,结果是“sunday”。

        【讨论】:

        • 这对我来说是一个骄傲的时刻——我的第一个 Ruby!我使用 ruby.ch/interpreter/rubyinterpreter.shtml 测试了代码,并参考了明显有用的文档。
        • 好的,谢谢。但是,我使用的是 Ruby,宁愿坚持使用 gsub 方法。我使用 #{word} 传递我想要突出显示的单词。所以在这个例子中,word = 'below'
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        • 2021-06-09
        • 2018-07-09
        相关资源
        最近更新 更多