Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby regex“;包含一个单词";_Ruby_Regex - Fatal编程技术网

Ruby regex“;包含一个单词";

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

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

假设我有一个接受文本的web表单。我知道如果我想看看这个句子——仅仅——是否包含我可以使用的“join”

    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)