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

我正在努力寻找一个通用的规则,因为我是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                   '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))