Ruby正则表达式:包含一个单词

18

在Ruby中,我如何编写正则表达式来检查提交的单词?

假设我有一个接受文本的Web表单。如果我想要查看句子是否--仅--包含"join",我可以使用:

    if the_body == "join"

但仅当整个文本提交为"join"时才有效。

我如何捕获这样的提交:

"我想加入你的俱乐部?" 或者 "请加入我"

谢谢!


6
你是否也想要抓住“合资企业”这个机会? - Tim Pietzcker
3个回答

34
你可以用以下方法实现
string =~ /join/i
# /i makes it case insensitive
或者
string.match(/join/i)

关于性能评论的一点更新:

>> s = "i want to join your club"
>> n = 500000
=> 500000
>> Benchmark.bm do |x|
..     x.report { n.times { s.include? "join" } }
..   x.report { n.times { s =~ /join/ } }
..   end
       user     system      total        real
   0.190000   0.000000   0.190000 (  0.186184)
   0.130000   0.000000   0.130000 (  0.135985)

虽然速度差异在这里并不重要,但正则表达式版本实际上更快。


1
你确定开销没问题吗?String#include?最后使用了Rabin-Karp算法,其最坏情况下的性能为O(mn),而一个合适的正则表达式引擎可能可以在O(n)内完成此操作。 - Michael Kohl
1
嗯,这是我一直听到的。虽然我没有进行调查来验证它 - 但听起来很有道理。所以,不确定。;) - thomthom
2
如果这只是道听途说,而你自己并没有验证过,那么在你的帖子中提到它可能不太合适,可以将其作为评论添加到其他帖子中;-) 不过我同意include?实际上非常好地传达了语义,而且性能差异在任何情况下都应该是可以忽略不计的 :-) - Michael Kohl
当然,它会在各种运行中来回反复。我想说的是,语义可能比性能更好地解决这个问题。无论如何,OP要求正则表达式,我提供了一个正则表达式答案。个人而言,我喜欢并经常使用它们,但很多人似乎对它们有抵触情绪。 - Michael Kohl
就我个人而言,我刚刚进行了类似于Michael的基准测试,并得到了相反的结果(在多次运行中正则表达式始终较慢)。我同意Michael的观点,即语义更重要,但我很好奇为什么我会看到与他不同的性能表现(我正在Windows系统上运行Ubuntu虚拟机,使用ruby 1.9.2)。 - Marc Talbot
显示剩余4条评论

11

找到字符串中确切单词的正确方法是:

the_body.match(/\bjoin\b/i) 或使用其他正则表达式:

(\W|^)join(\W|$)

请注意,我们需要找出字符串中是否存在“join”这个单词。以上所有解决方案都无法适用于以下字符串:they are joining canalsMy friend Bonjoiny is a cool guy


-1
这里不需要正则表达式 -- String#include? 就可以完成工作。

2
他/她想要一个确切的单词。 - Ele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接