我在 Ruby 中使用 gsub 使文本中的单词变为粗体。我正在使用单词边界,以免其他单词中的字母变粗,但我发现这会忽略后面有引号的单词。例如:
text.gsub(/#{word}\b/i, "<b>#{word}</b>")
text = "I said, 'look out below'"
word = below
在这种情况下,下面的单词没有加粗。有没有办法忽略某些字符以及单词边界?
非常小心你的\b
界限。 这就是为什么。
所有逃逸的东西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
调用中使用单引号字符串文字,则无需转义反斜杠。
该#{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 ”结尾。