Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Excel或Google公式计算文本字符串中8位数字的出现次数_Regex_Excel_Google Sheets_Excel Formula_Google Sheets Formula - Fatal编程技术网

Regex Excel或Google公式计算文本字符串中8位数字的出现次数

Regex Excel或Google公式计算文本字符串中8位数字的出现次数,regex,excel,google-sheets,excel-formula,google-sheets-formula,Regex,Excel,Google Sheets,Excel Formula,Google Sheets Formula,我希望你能帮助我 我有一个数据集,其中包括一个自由文本评论字段;在该字段中,输入了我想要计数的工单编号-工单编号始终为8位数,我认为我已经用以下方法破解了它: =ROUNDDOWNSUMPRODUCTLENM7-LENSUBSTITUTEM7,{0,1,2,3,4,5,6,7,8,9},/8,0,正确识别注释中的WO编号,如下所示: NWMS - 67431710 - Mattress eta pending from contractor NWMS - 67431797 - Double ba

我希望你能帮助我

我有一个数据集,其中包括一个自由文本评论字段;在该字段中,输入了我想要计数的工单编号-工单编号始终为8位数,我认为我已经用以下方法破解了它: =ROUNDDOWNSUMPRODUCTLENM7-LENSUBSTITUTEM7,{0,1,2,3,4,5,6,7,8,9},/8,0,正确识别注释中的WO编号,如下所示:

NWMS - 67431710 - Mattress eta pending from contractor
NWMS - 67431797 - Double base eta pending from contractor
并返回一个计数2,这是一个包含多行注释的单个单元格

还有,;因为采用了舍入公式;这样的评论: CMS-67630485来自废物出口或堵塞物的气味eta 05.02仅返回一个正确的WO计数

但是,;我面临的新问题是,如果添加了ETA日期,该日期也有8位数字-例如,2020年2月7日-这将错误地将WO编号增加1

我想我是在寻找一种在一个更大的文本字符串中计算8个连续数字块的方法。这将排除输入的任何其他数字


我在Google Sheets工作,但我更了解Excel,因此任何一个的公式都会帮助我,因为我应该能够将其转换为任何一种方式。

您可以尝试在Google Sheets中使用正则表达式来匹配八位数字

例如,以下内容将用@替换所有八位数字组

然后你可以使用lenM7-lenM7替代品。。。方法来计算字符串中八位数的出现次数

最后的公式看起来像

=len(REGEXREPLACE(M7,"\d{8}","@"))-len(SUBSTITUTE(REGEXREPLACE(M7,"\d{8}","@"),"@",""))

您可以尝试在Google工作表中使用正则表达式来匹配八位数字

例如,以下内容将用@替换所有八位数字组

然后你可以使用lenM7-lenM7替代品。。。方法来计算字符串中八位数的出现次数

最后的公式看起来像

=len(REGEXREPLACE(M7,"\d{8}","@"))-len(SUBSTITUTE(REGEXREPLACE(M7,"\d{8}","@"),"@",""))
在MS Excel中,您可以使用FILTERXML函数获得必要的结果:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))=8))
只有空格不应重复

编辑1:

前导零和重复空格的解决方案:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>#" & SUBSTITUTE(A1," ","</a><a>#") & "</a></data>","//a"))=9))
编辑2:

排除时间的解决方案:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(SUBSTITUTE(A5,":","_")," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>#" & SUBSTITUTE(A5," ","</a><a>#") & "</a></data>","//a"))=9))
在MS Excel中,您可以使用FILTERXML函数获得必要的结果:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))=8))
只有空格不应重复

编辑1:

前导零和重复空格的解决方案:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>#" & SUBSTITUTE(A1," ","</a><a>#") & "</a></data>","//a"))=9))
编辑2:

排除时间的解决方案:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(SUBSTITUTE(A5,":","_")," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>#" & SUBSTITUTE(A5," ","</a><a>#") & "</a></data>","//a"))=9))

较短的谷歌表格替代方案:

=INDEX(COUNTIF(SPLIT(REGEXREPLACE(A1, "\d{8}", "♦♥"), "♦"), "*♥*"))

较短的谷歌表格替代方案:

=INDEX(COUNTIF(SPLIT(REGEXREPLACE(A1, "\d{8}", "♦♥"), "♦"), "*♥*"))

由于您询问了如何在Excel中使用正则表达式,下面是一个简单的UDF,它将返回字符串中的模式计数

它应该可以移植到其他版本的Windows Excel。 它不能在Mac Excel上工作,因为它没有所需的dll

Option Explicit
Function REGEXCount(S As String, sPattern As String) As Long
    Dim RE As Object, MC As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = sPattern
    Set MC = .Execute(S)
End With

REGEXCount = MC.Count
End Function
您可以在工作表上使用此选项,如:

=REGEXCount(cell_ref or string,"\b\d{8}\b")
假设您的八位数字被非单词字符或行/字符串的开头或结尾包围

单词字符是[A-Za-z0-9]集合中的任何字符

如果WO前面或后面可能有下划线,则只需将模式更改为:?:[^A-Za-z0-9]| ^\d{8}?:[^A-Za-z0-9]|$

UDF可以变得更灵活,但这将适用于您的示例


由于您询问了如何在Excel中使用正则表达式,下面是一个简单的UDF,它将返回字符串中的模式计数

它应该可以移植到其他版本的Windows Excel。 它不能在Mac Excel上工作,因为它没有所需的dll

Option Explicit
Function REGEXCount(S As String, sPattern As String) As Long
    Dim RE As Object, MC As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = sPattern
    Set MC = .Execute(S)
End With

REGEXCount = MC.Count
End Function
您可以在工作表上使用此选项,如:

=REGEXCount(cell_ref or string,"\b\d{8}\b")
假设您的八位数字被非单词字符或行/字符串的开头或结尾包围

单词字符是[A-Za-z0-9]集合中的任何字符

如果WO前面或后面可能有下划线,则只需将模式更改为:?:[^A-Za-z0-9]| ^\d{8}?:[^A-Za-z0-9]|$

UDF可以变得更灵活,但这将适用于您的示例


这看起来很棒;我想REGEXREPLACE和SUBSTITUTE之间的主要区别在于,您可以搜索块{8},而不仅仅是一个数字,这正是我所需要的。出于兴趣,有没有Excel的等价物?我不这么认为。我不再真正使用Excel了。所以,如果最近引入了一个新的公式,我就不知道了-@AlanEnglefield为了能够在工作表上使用正则表达式,您必须在VBA中编写一个UDF。@RonRosenfeld这是您可以提供的建议吗?而且如果我把它通过电子邮件发送给其他人,它会和文件一起吗?Thanks@AlanEnglefield请看公认的答案。就发布而言,您可能希望将建议从早期绑定更改为后期绑定,这样您的用户就不必勾选引用;我想REGEXREPLACE和SUBSTITUTE之间的主要区别在于,您可以搜索块{8},而不仅仅是一个数字,这正是我所需要的。出于兴趣,是否有

相当于Excel?我不这么认为。我不再真正使用Excel了。所以,如果最近引入了一个新的公式,我就不知道了-@AlanEnglefield为了能够在工作表上使用正则表达式,您必须在VBA中编写一个UDF。@RonRosenfeld这是您可以提供的建议吗?而且如果我把它通过电子邮件发送给其他人,它会和文件一起吗?Thanks@AlanEnglefield请看公认的答案。就分发而言,您可能希望将建议从早期绑定更改为后期绑定,这样您的用户就不必勾选引用。由于FILTERXML处理数字数据的方式,如果WO编号的前导为零,此方法将返回不可靠的结果。@Ron Rosenfield是的,但它很容易解决。编辑。@basic这太棒了——不过还是要谢谢你;我在下面的例子中使用了你编辑过的例子,我得到了一个2??'mde-67832405需要新的临时桶-锁被卡住,无法进入房间-2020年2月9日08:55:43'是因为时间因素吗?是的,是因为时间因素。那么,我们可以在ISNUMBER测试中添加另一个替换项-replace:with u。编辑。谢谢@basicbut不幸的是;您的公式遗漏了任何带有破折号的工单编号。据我所知,你的公式,他们在寻找一个由空格包围的8位数字块,但由于这是由一个自由文本字段提供的,情况并非总是如此:由于FILTERXML处理数字数据的方式,如果WO编号的前导为零,这种方法将返回不可靠的结果。@Ron Rosenfield Yes,但这很容易解决。编辑。@basic这太棒了——不过还是要谢谢你;我在下面的例子中使用了你编辑过的例子,我得到了一个2??'mde-67832405需要新的临时桶-锁被卡住,无法进入房间-2020年2月9日08:55:43'是因为时间因素吗?是的,是因为时间因素。那么,我们可以在ISNUMBER测试中添加另一个替换项-replace:with u。编辑。谢谢@basicbut不幸的是;您的公式遗漏了任何带有破折号的工单编号。据我所知,你的公式,他们正在寻找一个由空格包围的8位数字组成的块,但由于这是由一个自由文本字段提供的,情况并非总是如此:othanks@Ron起作用-你引用的第一个模式也计算前面或后面有破折号的WO编号。我不确定我是否可以在我们的组织内分发启用宏的excel文件,但您的答案确实有效!!谢谢again@AlanEnglefield是的,两者都可以,因为破折号或连字符是非单词字符。这就是你想要的吗?还是不?如果没有,请提供数据示例和您的预期结果。这正是我想要的。基本上,我需要提取隐藏在所有评论和ETA中的工单数量,无论它们是如何出现的,并且这是一个自由文本字段;他们通常被一大堆废话包围着,我不需要哈哈,再次感谢Hanks@Ron,这是一种享受——你引用的第一种模式也包括前面或后面有破折号的WO数字。我不确定我是否可以在我们的组织内分发启用宏的excel文件,但您的答案确实有效!!谢谢again@AlanEnglefield是的,两者都可以,因为破折号或连字符是非单词字符。这就是你想要的吗?还是不?如果没有,请提供数据示例和您的预期结果。这正是我想要的。基本上,我需要提取隐藏在所有评论和ETA中的工单数量,无论它们是如何出现的,并且这是一个自由文本字段;他们通常被一大堆废话包围着,我不需要哈哈,再次谢谢