Regex Excel或Google公式计算文本字符串中8位数字的出现次数
我希望你能帮助我 我有一个数据集,其中包括一个自由文本评论字段;在该字段中,输入了我想要计数的工单编号-工单编号始终为8位数,我认为我已经用以下方法破解了它: =ROUNDDOWNSUMPRODUCTLENM7-LENSUBSTITUTEM7,{0,1,2,3,4,5,6,7,8,9},/8,0,正确识别注释中的WO编号,如下所示: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
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中的工单数量,无论它们是如何出现的,并且这是一个自由文本字段;他们通常被一大堆废话包围着,我不需要哈哈,再次谢谢