我正在为此寻找一个通用规则,因为我是regex领域的新手。我尝试了很多不同的组合,但没有成功。我发布了我最好的一本书,但仍然想念其中一些。 简而言之,我想在数组的不同单元中提取订单号和产品号。 (全局和多行)
for Product # [\D^\s]([790]\d{1,4})[\D\s$]
for Order# (6 or 7 character) ([56]\d{6})[\D$]|[\D^]([56]\d{5})[\D$]
我对所有小组的最终模式:
[\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环境中使用它。
答案 0 :(得分:3)
您正在混淆现有正则表达式中的很多东西。
[]
这定义了一个字符集。 {em> 会匹配^
或$
之类的位置标记。
[\D\s$]
匹配\D
(任何非数字字符)或\s
(任何空白字符)或$
(字面上的美元符号)[\D?|^]
匹配\D
(任何非数字字符)或?
(字面上的问号)或|
(字面上的竖线符号)或{{1} }(字面上的克拉符号)上述内容的某些例外情况是特定于字符集的符号(通常与位置有关),例如:
^
集合中没有的任何字符-开头必须有克拉([^]
集合中没有的任何字符-任何非数字字符)[^\d]
介于[0-9]
到0
之间的任何字符(基于ASCII表)。很多时候,我们看到人们指定的9
与a-Z
不匹配,它也与a-zA-Z
和`相匹配-参见http://www.asciitable.com/)相反,请使用非捕获组将这些事物组合在一起。如果您需要在正则表达式中使用[\]^_
或^
之类的位置标记,请将它们作为替代$
包含在内。
[\d\s]|$
以上内容的工作方式如下:
(?:^|\D)([790]\d{1,4})(?!\d)
声明行首或匹配任何非数字字符(?:^|\D)
匹配[790]\d{1,4}
中的任何字符,然后再匹配任何数字1-4次(匹配以7、9或0开头的5位数字)790
断言后面的内容不是数字(由于不是数字,因此也将与行尾匹配)(?!\d)
以上内容的工作方式如下:
(?:^|\D)[56]\d{5,6}(?!\d)
声明行首或匹配任何非数字字符(?:^|\D)
匹配[56]\d{5,6}
中的任何字符,然后再匹配任意5到6位数字(匹配以5或6开头的5或6位数字)56
断言后面的内容不是数字(由于不是数字,因此也将与行尾匹配)(?!\d)
第一个捕获组是订单号,第二个是产品号。
答案 1 :(得分:2)
我 认为 ,这就是您需要的:
(?<=[^\d]|^)(?<order>[56]\d{5,6})(?=[^\d]|$)|(?<=[^\d]|^)(?<product>[790]\d{1,4})(?=[^\d]|$)
我不知道VBA是否支持命名捕获组,例如?<order>
。如果没有,则分别删除?<order>
和?<product>
,您的匹配项将分别在$1
和$2
下可用。