所以我想多次将字符串与单词“cat”匹配,例如:
"cat cat cat cat cat"
或
"cat cat cat cat"
如果除了“cat”或空格之外还有其他任何内容,我不想匹配。所以我可以这样做:
^(cat\s*)+$
但是,我想知道字符串中出现了多少只猫。一种方法是计算组的数量,但是上面的正则表达式只会给我一个第一只猫的组,而不是每只猫的捕获。有没有办法使用正则表达式?
答案 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
编辑:
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
}