如何根据
获取某些范围的出现次数正则表达式
2+条件;让我们说出包含"是"和/或"不"
我目前得到的是:
COUNTIF(B5:O5; "*yes*")
我尝试使用COUNTIF(B5:O5; {"*yes*", "*no*"})
或COUNTIF(B5:O5; "(*yes*)|(*no*)")
,但他们都没有工作。
或者,我如何计算包含某些域名的单元格-yahoo.com,hotmail.com和gmail.com-使用正则表达式?例如:
(\W|^)[\w.+\-]{0,25}@(yahoo|hotmail|gmail)\.com(\W|$)
答案 0 :(得分:11)
您问题的最常行解决方案(在Excel和Google文档中测试)只需添加多个countif
公式的结果:
=COUNTIF(B5:O5, "*yes*") + COUNTIF(B5:O5, "*no*")
此表达式将使用“是”或“否”计算单元格的总数。它将使用“yesno”或“noyes”对单元格进行双重计数,因为它匹配两个表达式。您可以尝试用
取出双打=COUNTIF(B5:O5, "*yes*") + COUNTIF(B5:O5, "*no*") - COUNTIF(B5:O5, "*no*yes*") - COUNTIF(B5:O5, "*yes*no*")
但是这仍然会让你遇到像noyesno
这样的字符串的麻烦。
然而,Google Docs中有一个相当聪明的技巧,可能只是提示您正在寻找的解决方案:
=COUNTA(QUERY(A1:A9, "select A where A matches '(.*yes.*)|(.*no.*)'"))
QUERY
函数就像一个迷你数据库的东西。在这种情况下,它会查看范围A1:A9
中的表格,并仅选择A列中的元素,其中A matches
列中的对应元素(在preg regex
意义上的单词)表达式接下来 - 在这种情况下,“任何事后跟yes
后跟任何事情,或任何事后跟no
后跟任何事情”。在我做的一个简单示例中,这仅计算一次yesnoyes
- 使其完全符合您的要求(我认为......)
现在你的范围B5:O5
是几列宽,只有一行高;这使得很难使用QUERY
技巧。一些相当不那么优雅的东西(但不管范围的形状如何都有效)是这样的:
=countif(arrayformula(isnumber(find("yes",A1:A9))+isnumber(find("no",A1:A9))),">0")
isnumber
函数的总和充当了元素OR
- 遗憾的是,常规OR
函数似乎不适用于数组的各个元素。和以前一样,这会找到包含“是”或“否”的单元格,并计算包含其中任何一个字符串的单元格。
答案 1 :(得分:1)
这在很大程度上受到Floris's answer的启发。尤其请参见注释。如果您TRANSPOSE
要比较的项目行,则QUERY
也适用于水平数据:
=COUNTA(QUERY(TRANSPOSE(B5:O5), "select * where Col1 matches '.*(yes|no).*'"))
据我所知,Col1
是“特殊”的,并且区分大小写!
答案 2 :(得分:0)
我遇到了同样的问题,如果您不想使用VBA
,请尝试在您的公式中添加SUM
:
=SUM(COUNTIF(B5:O5; {"*yes*", "*no*"}))
答案 3 :(得分:0)
NGix找到的最简单的方法是创建用于这些目的的自定义函数。他们添加了2个最适合他们的方法,并希望它也能对某人有所帮助:
/**
* Count if cell value matches any condition ( supports regexp also )
*/
function countCustomMatchOr(data){
var count = 0;
for(var i=0; i < data.length; i++){
for(var j=0; j<data[i].length; j++){
var cell = data[i][j];
for(var k=1;k<arguments.length;k++){
if(typeof arguments[k] == "number"){
if(arguments[k] == cell) count++;
} else if(cell.toString().match(arguments[k])) count++;
}
}
}
return count;
}
和
/**
* Counts value in data range if matches regular expression
*/
function countCustomRegExp(data, reg, flag){
var rows = data.length, count = 0, re = flag?new RegExp(reg, flag):new RegExp(reg);
for( var i = 0; i < rows; i++){
for( var j = 0; j < data[i].length; j++){
if( data[i][j] != "" && data[i][j].toString().match(re) ){
count++;
}
}
}
return count;
}
要使用它们,只需应用countCustomRegExp(A2:G3;"yes.*")
或countCustomMatchOr(A2:G3;"yes";"no")