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

问题描述 投票:7回答:4

如何根据以下内容获取某些范围的出现次数

  1. 正则表达式
  2. 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|$)
regex google-docs countif
4个回答
11
投票

解决问题的最行人解决方案(在Excel和Google Docs中测试)只需添加几个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
投票

这很大程度上受到Floris's answer的启发。特别参见评论。如果你TRANSPOSE要比较的项目行,QUERY也适用于水平数据:

=COUNTA(QUERY(TRANSPOSE(B5:O5), "select * where Col1 matches '.*(yes|no).*'"))

据我所知,Col1是“特殊的”并且区分大小写!


0
投票

我有同样的问题,如果你不想使用VBA,尝试添加一个SUM到你的公式:=SUM(COUNTIF(B5:O5; {"*yes*", "*no*"}))


0
投票

NGinx发现的最简单方法是为这些目的创建自定义功能。他们添加了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")

© www.soinside.com 2019 - 2024. All rights reserved.