Ruby regex“;包含一个单词";
在Ruby中,如何编写正则表达式来检查提交的单个单词 假设我有一个接受文本的web表单。我知道如果我想看看这个句子——仅仅——是否包含我可以使用的“join”Ruby regex“;包含一个单词";,ruby,regex,Ruby,Regex,在Ruby中,如何编写正则表达式来检查提交的单个单词 假设我有一个接受文本的web表单。我知道如果我想看看这个句子——仅仅——是否包含我可以使用的“join” if the_body == "join" 但这只有在提交的整个文本都是“join”时才有效 我如何捕获这样的提交: “我想加入你的俱乐部?”或者 “请加入我” 谢谢 这里不需要Regexp--String#include?就可以了。你可以用 string =~ /join/i # /i makes it case insens
if the_body == "join"
但这只有在提交的整个文本都是“join”时才有效
我如何捕获这样的提交:
“我想加入你的俱乐部?”或者
“请加入我”
谢谢 这里不需要Regexp--
String#include?
就可以了。你可以用
string =~ /join/i
# /i makes it case insensitive
或
关于性能注释的一点更新:
>> 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)
虽然速度差异在这里并不重要,但regex版本实际上更快。在字符串中找到精确单词的正确解决方案是
主体匹配(/\bjoin\b/i)
或使用其他正则表达式:
(\W|^)连接(\W|$)
请注意,我们需要找到字符串中是否存在“join”单词。以上所有的解决方案对于字符串都会失败,例如:
他们正在加入运河
或我的朋友Bonjoiny是个很酷的家伙
,除了不需要执行正则表达式-它的开销比普通字符串搜索要高。你确定开销吗String#include?
最后使用了Rabin-Karp算法,该算法在最坏情况下的性能为O(mn),而一个合适的正则表达式引擎可能在O(n)中实现这一点。好吧,这是我一直被告知的。虽然我还没有调查来证实这一点——听起来似乎有道理。所以,不,我不确定如果这是道听途说,而你自己也没有核实过,那么你可能不应该在你的帖子中提及它,并将其作为评论添加到其他帖子中;-)我同意,include?
实际上很好地传达了语义,性能差异在任何情况下都可以忽略不计:-)当然,它会在各种运行中来回运行。我想说的是,语义可能是比性能更好的解决这个问题的方法。不管怎样,OP要求使用正则表达式,我提供了正则表达式的答案。就我个人而言,我喜欢并经常使用它们,但很多人似乎都不喜欢它们。你是否也想抓住“合资企业”?他/她想要一个确切的词。
>> 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)