【发布时间】: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 中使用 gsub 使文本中的单词变为粗体。我正在使用单词边界,以免其他单词中的字母变粗,但我发现这会忽略后面有引号的单词。例如:
text.gsub(/#{word}\b/i, "<b>#{word}</b>")
text = "I said, 'look out below'"
word = below
在这种情况下,下面的单词不会加粗。有什么办法可以忽略某些字符以及单词边界?
【问题讨论】:
非常小心您的\b 边界。 Here’s why.
【讨论】:
Regexp.new 中的所有转义看起来都非常难看。您可以通过使用 Regexp 文字来大大简化它:
word = 'below'
text = "I said, 'look out below'"
reg = /\b#{word}\b/i
text.gsub!(reg, '<b>\0</b>')
此外,您可以直接使用gsub! 的修饰符形式,除非该字符串在您未向我们显示的代码中的其他位置使用别名。最后,如果您在 gsub 调用中使用单引号字符串文字,则无需转义反斜杠。
【讨论】:
#{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 对其进行转义。
此外,通过将字符串替换为<b>#{word}</b>,您可以更改字符串的大小写:“BeloW”将被替换为“below”。 \0 通过替换找到的单词来纠正这个问题。另外,我在开头加了\\b,你不要找“day”,结果是“sunday”。
【讨论】: