2010-05-25 83 views
2

我在Ruby中使用gsub使文本中的单词变为粗体。我使用的是单词边界,以避免使用其他字母中的字母粗体,但是我发现这忽略了后面带有引号的单词。例如:在正则表达式中忽略字符和字边界

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

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

在这种情况下,下面的字是不是做出了大胆的。有什么方法可以忽略某些字符和字边界?

回答

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调用中使用单引号字符串,则不需要转义反斜杠。

0

#{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>") 

注意,使用蜇当你需要逃避\b\\b,或者它被解释为退格键。如果word可能包含特殊的正则表达式字符,请使用Regexp.escape将其转义。

此外,通过将字符串替换为<b>#{word}</b>,您可以更改字符串的外壳:“BeloW”将替换为“下方”。 \0通过替换找到的单词来纠正此问题。另外,我在开头添加了\\b,您不希望查找“”,并以“sun日期”结束。

+0

这对我来说是一个值得骄傲的时刻 - 我的第一次Ruby!我使用http://www.ruby.ch/interpreter/rubyinterpreter.shtml测试了代码,并引用了显然有用的文档。 – Kobi 2010-05-25 04:56:39

+0

好的谢谢。不过,我使用的是Ruby,宁愿坚持使用gsub方法。我使用#{word}来传递我想强调的单词。所以在这个例子中,word ='below' – DavidP6 2010-05-25 07:06:06