Ruby 用正则表达式计算猫的数目

Ruby 用正则表达式计算猫的数目,ruby,regex,Ruby,Regex,因此,我想将一个字符串与其中的单词“cat”进行多次匹配,例如: "cat cat cat cat cat" 或 如果除了“猫”或空格还有什么,我不想匹配。所以我可以做到: ^(cat\s*)+$ 然而,我想知道有多少猫出现在字符串中。一种方法是计算组的数量,但是上面的正则表达式只会给我一个包含第一只猫的组,而不是每个猫的捕获。有没有一种方法可以使用正则表达式实现这一点?考虑将空格转换为换行符,然后计算与regexp匹配的行数。您需要做两件不同的事情-验证字符串和计算单词出现次数。通常你不能

因此,我想将一个字符串与其中的单词“cat”进行多次匹配,例如:

"cat cat cat cat cat"

如果除了“猫”或空格还有什么,我不想匹配。所以我可以做到:

^(cat\s*)+$

然而,我想知道有多少猫出现在字符串中。一种方法是计算组的数量,但是上面的正则表达式只会给我一个包含第一只猫的组,而不是每个猫的捕获。有没有一种方法可以使用正则表达式实现这一点?

考虑将空格转换为换行符,然后计算与regexp匹配的行数。

您需要做两件不同的事情-验证字符串和计算单词出现次数。通常你不能一步完成这两件事

var str   = "cat cat cat cat cat";
var count = 0;

if ( /^(cat\s*)+$/.test(str) ) {
  count = str.match(/cat/g).length;
}

在.NET正则表达式中,列出了组匹配的所有事件,而不仅仅是最后一个,就像在其他正则表达式引擎中一样。在这里,您可以一步完成验证和计数。

这实际上是您捕获的最后一只猫。这种情况的发生是因为天气恶劣。我认为不可能从一个团队中获得多个捕获。你能做的最好的事情可能是:

var str   = "cat cat cat cat cat";
var count = 0;

if ( /^(cat\s*)+$/.test(str) ) {
  count = str.match(/cat/g).length;
}
str = "cat   cat cat  cat"

matchdata = str.match(/^((?:cat\s*)+)$/)
=> #<MatchData "cat   cat cat  cat" 1:"cat   cat cat  cat"> 

matchdata[0].split(/\s+/).size
=> 4
str=“猫”
matchdata=str.match(/^((?:cat\s*)+)$/)
=> # 
匹配数据[0]。拆分(/\s+/)。大小
=> 4

没有正则表达式的Ruby方法是:

string = "cat   cat cat  cat"
def match_cat(string)
  cat_array = string.split
  count = cat_array.size
  cat_array.uniq == ["cat"] ? count : false
end
match_cat(string)
=> 4

<> P>注意到迈克的原始正则表达式以及Tomalak、Marten、TaGman的答案都是错误的,当字符串包含连续的“猫”的实例时(除非你想把CATCAT视为“CAT”两个实例)。以下内容不满足此问题

def count_if_match
  delimiters = strip.split('cat')
  delimiters.length+1 if delimiters.all?{|s| s =~ / +/}
end

' cat   cat cat  cat'.count_if_match # => 4
' catcat cat cat'.count_if_match # => nil

我没有看到任何人提到我认为明显的答案,使用字符串扫描:

如果您只需要使用正则表达式:

str.scan(/cat/).size #=> 5
如果希望只捕获唯一的事件,而不是一起运行,请执行以下操作:

str.scan(/\bcat\b/).size #=> 3

编辑:

@萨瓦指出,对OP的问题存在(相当大的)误解空间。这涵盖了当字符串中除了
cat
之外还有其他内容时OP不希望进行搜索的情况

str.scan('cat').size if str.gsub(/(?:cat| )+/, '').empty? #=> 5
我上一节中的其他变化仍然可以应用


而且,由于“空白”可能不仅仅意味着一个简单的空格,
“\s”
也应该可以很好地工作。

/(cat\s*)/g
在JavaScript中为您提供了一个
cat
数组。是的,但这也将与我不想要的“cat-dog”匹配。如果有差异,这段代码是用Ruby编写的。。我想我有一个答案,但我想看看是否有更好的方法。你不能使用那个regexp。它将给出错误的结果。看看我的答案。我想你的问题可能有误导性。你有这样一句话:“……除了‘猫’或空白以外的任何东西,我都不想匹配”。如果你只想数一数“猫”的数量,那么你就不必提及空格了。因此,我解释了你所说的“我不想匹配”的意思,在这种情况下你想返回零。这也是我得出的结论。我最终只是按原样使用正则表达式,然后不用查看组数组,而是可以执行“cat.scan('cat')。count@Mike:是的,这与我的JS示例基本相同。@sawa:嗯<代码>“catcat”。匹配(/cat/g)。长度==5。对我来说似乎是对的。你想把“猫猫”当作“猫”这个词的两个例子吗?那么你是对的,但我没有这么想。”萨瓦:嗯,我不知道还有什么我可以考虑的。就像我认为<代码>“AA”<代码>两个实例:<代码>“a”/代码>;我认为你的回答很直截了当,对迈克的问题有一种解释。我认为这个问题可能有误导性或不清楚。迈克说,“除了‘猫’或空白之外,还有其他的东西”时,“我不想匹配”。如果他只是想数“猫”,那么他就不需要提到“空白”。因此,我认为当字符串包含这样的字符时,他不想返回整个字符串的计数。同意-在我的特定情况下,这并不重要(我不是/实际上是/寻找猫),但指出这一点很好。
"cat   cat cat  cat".split.count{|w|
    break false unless w == 'cat'

    true
}
"cat   cat cat  cat".split.count{|w|
    break false unless w == 'cat'

    true
}