根据2个条件或Regexp计算出现次数

时间:2013-08-20 19:58:27

标签: regex google-docs countif

如何根据

获取某些范围的出现次数
  1. 正则表达式

  2. 2+条件;让我们说出包含"是"和/或"不"

  3. 我目前得到的是:

    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|$)
    

4 个答案:

答案 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")