用正则表达式计算猫

时间:2011-03-19 09:55:47

标签: ruby regex

所以我想多次将字符串与单词“cat”匹配,例如:

"cat cat cat cat cat"

"cat   cat cat  cat"

如果除了“cat”或空格之外还有其他任何内容,我不想匹配。所以我可以这样做:

^(cat\s*)+$

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

7 个答案:

答案 0 :(得分:5)

我没有看到有人提到我认为明显的答案,使用String#scan:

str = "cat cat cat    catcat"
str.scan('cat').size #=> 5

如果您 使用正则表达式:

str.scan(/cat/).size #=> 5

如果您只想捕获唯一的,而不是一起出现的事件:

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

编辑:

@sawa指出,存在(相当大的)误解OP问题的空间。这包括如果字符串中除cat" "之外的其他内容,OP不希望进行搜索的情况。

str.scan('cat').size if str.gsub(/(?:cat| )+/, '').empty? #=> 5

我上一节中的其他变体仍然可以应用。

而且,由于“空白”可能意味着不仅仅是一个简单的空间,"\s"也应该可以正常工作。

答案 1 :(得分:3)

请注意,当字符串包含连续的'cat'实例时,Mike的原始regexp以及Tomalak,Marten,tagman的答案都会给出错误的计数(除非您想将'catcat'视为该单词的两个实例'猫')。以下不符合此问题。

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

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

考虑将空格转换为换行符,然后计算与正则表达式匹配的行。

答案 4 :(得分:0)

它实际上是你捕获的最后一只猫。这是因为greediness of + and the way capture groups work。我认为不可能从一个组中获得多个捕获。你可以做的最好的事情可能是:

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

答案 5 :(得分:0)

没有正则表达式的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

答案 6 :(得分:0)

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

    true
}