2

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

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

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

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

4

3 回答 3

2

非常小心你的\b界限。 这就是为什么

于 2010-11-18T13:49:23.950 回答
2

所有逃逸的东西Regexp.new看起来都很丑陋。您可以通过使用 Regexp 文字来大大简化它:

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

reg = /\b#{word}\b/i
text.gsub!(reg, '<b>\0</b>')

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

于 2010-05-25T07:03:03.767 回答
-1

#{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 ”并以“sun day ”结尾。

于 2010-05-25T04:48:16.660 回答