捕获 [A-Z0-9]{6} - 但前提是它不是 \d{6}

Capture [A-Z0-9]{6} - but only if it's not \d{6}

我有一封电子邮件,其中包含一些 11 位长的数字 - 这很简单:\d{11}

还有长度为 6 个字符的“单词”。
那里的字母总是大写的。
它可能包含 1-5 个数字,但绝不会包含 6。它永远不会扩展 6 的大小。

\b(\d{11}|([A-Z0-9]{6}))(\s|\.|$)

也捕获例如我想省略的“123456”。

它在一封电子邮件中,所以我使用 VBA 和它的“Microsoft VBScript Regular Expression 5.5”-Library。

您可以使用这个正则表达式:

\b(?:\d{11}|(?=\d{0,5}[A-Z])[A-Z0-9]{6})(?:[\s\.]|$)

RegEx Demo

(?=\d{0,5}[A-Z]) 是一个肯定的前瞻,它断言在 0 到 5 位数字之后存在大写字母,因此当第二个交替选项中有 6 位数字时匹配失败。

我想你在追求:

\b(?:\d{11}|(?!\d{6})[A-Z\d]{6})\b

网上看一个demo

  • \b - 单词边界。
  • (?: - 打开非捕获组:
    • d{11} - 十一个数字。
    • | - 或者:
    • (?!\d{6}) - 6 个数字的负前瞻。
    • [A-Z\d]{6} - 恰好六个大写字母或数字。
    • ) - 关闭非捕获组。
  • \b - 单词边界。