Regex 用于获取产品和订单的正则表达式#
我正在努力寻找一个通用的规则,因为我是regex领域的新手。我尝试了很多不同的组合,但没有成功。我发布了我最好的一张,但仍然错过了其中的一些。Regex 用于获取产品和订单的正则表达式#,regex,vba,Regex,Vba,我正在努力寻找一个通用的规则,因为我是regex领域的新手。我尝试了很多不同的组合,但没有成功。我发布了我最好的一张,但仍然错过了其中的一些。 抽象地说,我想在数组的不同单元格中提取订单号和产品号。(全球和多线) 我对所有组的最终模式: [\D^\s]([790]\d{1,4})[\D\s$][\D?|^]|([790]\d{1,4})[\D$]|([56]\d{6})[\D$]|[\D?|^]([56]\d{5})[\D$] 以下是一些示例 5494398 70008
抽象地说,我想在数组的不同单元格中提取订单号和产品号。(全球和多线) 我对所有组的最终模式:
[\D^\s]([790]\d{1,4})[\D\s$][\D?|^]|([790]\d{1,4})[\D$]|([56]\d{6})[\D$]|[\D?|^]([56]\d{5})[\D$]
以下是一些示例
5494398 70008 'order # 5494398 Product#: 70008
5001447452 ' should be ignored
6415366 OSW SHIP 70052 'order # 6415366 Product#: 70052
6567598y7058 Nov 20 'order # 6567598 Product#: 7058
OSW SHIP 70054 RH STRONGBACKS 'order # N/A Product#: 70054
OSW HS 70052 70053 'order # N/A Product#: 70008
6511534 04450 'order # 6511534 Product#:either 04450 or 0445 (this is only case)
6511538 0046 'order # 6511538 Product#: 0046
0046 6387125 'order # 6387125 Product#: 0046
OSW 70032 'order # N/A Product#: 70032
OSW HEX Blots 046 047 048 049 'order # N/A Product#: 064 & 047 & 048 & 049 (4 matches)
这就是我得到的,我想我没有准确地确定起始点和设置长度,也不知道为什么最后一个产品编号没有确定!下面我发布了测试结果。我在VBA环境中使用它
提前感谢。M 我认为这就是你需要的:
(?<=[^\d]|^)(?<order>[56]\d{5,6})(?=[^\d]|$)|(?<=[^\d]|^)(?<product>[790]\d{1,4})(?=[^\d]|$)
(?I我想这就是你需要的:
(?<=[^\d]|^)(?<order>[56]\d{5,6})(?=[^\d]|$)|(?<=[^\d]|^)(?<product>[790]\d{1,4})(?=[^\d]|$)
(?为什么您的正则表达式不起作用
您在现有正则表达式中混淆了很多东西
[]
这定义了一个字符集。任何像^
或$
这样的位置标记都是按字面匹配的。
[\D\s$]
匹配\D
(任何非数字字符)或\s
(任何空白字符)或$
(美元符号)
[\D?| ^]
匹配\D
(任何非数字字符)或?
(问号符号)或
(垂直条形符号)或^
(克拉符号符号)
上述情况的一些例外情况是特定于字符集的符号(和位置通常很重要),例如:
[^]
任何不在集合中的字符-开头必须有克拉([^\d]
任何不在集合中的字符-因此任何非数字字符)
[0-9]
从0
到9
范围内的任何字符(基于ASCII表)。很多时候,我们看到人们指定a-Z
与a-zA-Z
不匹配,它与[\]^
和`以及-参见)
相反,使用非捕获组将这些内容分组在一起。例如,如果您需要在正则表达式中包含位置标记,如^
或$
,请将它们作为替代项[\d\s]|$
如何修复你的正则表达式
订单号
上述工作如下:
(?:^ |\D)
断言行的开头或匹配任何非数字字符
[790]\d{1,4}
匹配790
中的任何字符,然后再匹配任何数字1-4次(匹配从7、9或0开始的5位数字)
(?!\d)
断言以下内容不是数字(也将匹配行尾,因为它不是数字)
产品编号
上述工作如下:
(?:^ |\D)
断言行的开头或匹配任何非数字字符
[56]\d{5,6}
匹配56
中的任何字符,然后再匹配任何数字5-6次(匹配从5或6开始的5或6位数字)
(?!\d)
断言以下内容不是数字(也将匹配行尾,因为它不是数字)
合并正则表达式(最终模式)
第一个捕获组是order#,第二个是product#。为什么您的正则表达式不工作
您在现有正则表达式中混淆了很多东西
[]
这定义了一个字符集。任何像^
或$
这样的位置标记都是按字面匹配的。
[\D\s$]
匹配\D
(任何非数字字符)或\s
(任何空白字符)或$
(美元符号)
[\D?| ^]
匹配\D
(任何非数字字符)或?
(问号符号)或
(垂直条形符号)或^
(克拉符号符号)
上述情况的一些例外情况是特定于字符集的符号(和位置通常很重要),例如:
[^]
任何不在集合中的字符-开头必须有克拉([^\d]
任何不在集合中的字符-因此任何非数字字符)
[0-9]
从0
到9
范围内的任何字符(基于ASCII表)。很多时候,我们看到人们指定a-Z
与a-zA-Z
不匹配,它与[\]^
和`以及-参见)
相反,使用非捕获组将这些内容分组在一起。如果您需要在正则表达式中包含位置标记,如^
或$
,请将它们作为替代项,例如[\d\s]|$
如何修复你的正则表达式
订单号
上述工作如下:
(?:^ |\D)
断言行的开头或匹配任何非数字字符
[790]\d{1,4}
匹配790
中的任何字符,然后再匹配任何数字1-4次(匹配从7、9或0开始的5位数字)
(?!\d)
断言以下内容不是数字(也将匹配行尾,因为它不是数字)
产品编号
上述工作如下:
(?:^ |\D)
断言行的开头或匹配任何非数字字符
[56]\d{5,6}
匹配56
中的任何字符,然后再匹配任何数字5-6次(匹配从5或6开始的5或6位数字)
(?!\d)
断言以下内容不是数字(也将匹配行尾,因为它不是数字)
合并正则表达式(最终模式)
第一个捕获组是order#,第二个是product#。[\D$]
检查任何不是数字的字符或$
符号,而不是行尾[^\D^]
正在检查相同的代码,但实际上是^
。真的很混乱
(?:^|\D)([790]\d{1,4})(?!\d)
(?:^|\D)[56]\d{5,6}(?!\d)
(?:^|\D)([790]\d{1,4}(?!\d))|(?:^|\D)([56]\d{5,6}(?!\d))