正则表达式用于获取产品编号和订单编号

时间:2019-11-21 18:42:21

标签: regex vba

我正在为此寻找一个通用规则,因为我是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环境中使用它。

先谢谢了。
中号  Here is the test result I have

2 个答案:

答案 0 :(得分:3)

为什么您的正则表达式不起作用

您正在混淆现有正则表达式中的很多东西。

  • []这定义了一个字符集。 {em> 会匹配^$之类的位置标记。
    • [\D\s$]匹配\D(任何非数字字符)或\s(任何空白字符)或$(字面上的美元符号)
    • [\D?|^]匹配\D(任何非数字字符)或?(字面上的问号)或|(字面上的竖线符号)或{{1} }(字面上的克拉符号)

上述内容的某些例外情况是特定于字符集的符号(通常与位置有关),例如:

  • ^集合中没有的任何字符-开头必须有克拉([^]集合中没有的任何字符-任何非数字字符)
  • [^\d]介于[0-9]0之间的任何字符(基于ASCII表)。很多时候,我们看到人们指定的9a-Z不匹配,它也与a-zA-Z和`相匹配-参见http://www.asciitable.com/

相反,请使用非捕获组将这些事物组合在一起。如果您需要在正则表达式中使用[\]^_^之类的位置标记,请将它们作为替代$包含在内。


如何修复正则表达式

订单号

See regex in use here

[\d\s]|$

以上内容的工作方式如下:

  • (?:^|\D)([790]\d{1,4})(?!\d) 声明行首或匹配任何非数字字符
  • (?:^|\D)匹配[790]\d{1,4}中的任何字符,然后再匹配任何数字1-4次(匹配以7、9或0开头的5位数字)
  • 790断言后面的内容不是数字(由于不是数字,因此也将与行尾匹配)

产品编号

See regex in use here

(?!\d)

以上内容的工作方式如下:

  • (?:^|\D)[56]\d{5,6}(?!\d) 声明行首或匹配任何非数字字符
  • (?:^|\D)匹配[56]\d{5,6}中的任何字符,然后再匹配任意5到6位数字(匹配以5或6开头的5或6位数字)
  • 56断言后面的内容不是数字(由于不是数字,因此也将与行尾匹配)

合并正则表达式(最终模式)

See regex in use here

(?!\d)

第一个捕获组是订单号,第二个是产品号。

答案 1 :(得分:2)

认为 ,这就是您需要的:

(?<=[^\d]|^)(?<order>[56]\d{5,6})(?=[^\d]|$)|(?<=[^\d]|^)(?<product>[790]\d{1,4})(?=[^\d]|$)

我不知道VBA是否支持命名捕获组,例如?<order>。如果没有,则分别删除?<order>?<product>,您的匹配项将分别在$1$2下可用。

https://regex101.com/r/PeOfKm/1