正则表达式以匹配可能更大的字符串中的 16 个连续数字

regex to match exactly 16 consecutive digits in a potentially larger string

我需要一个正则表达式来精确匹配 16 个连续数字,不多也不少,不管它周围有什么(如果有的话)。我经历了几次迭代,但都遇到了问题:

  1. \d{16} 将匹配任意 16 个连续数字,包括较长数字串中的 16 个数字
  2. ^\d{16}$ 会匹配正好是 16 个连续数字的行,但如果字符串中有其他内容,则匹配失败
  3. \D\d{16}\D 将匹配 16 个连续数字的字符串,但前提是它被非数字字符包围。如果16位的字符串单独上线则失败
  4. \D?\d{16}\D? 将匹配更长的连续数字串
  5. [\D^]\d{16}[\D$]不把^$当作它们的特殊含义,而是把它们当成文字字符。

如何创建我需要的正则表达式?

编辑:这些是 PCRE 正则表达式

(?<=\D|^)\d{16}(?=\D|$)

这里的关键是积极的环顾四周。这些可以验证非数字字符而不捕获它们。

  • (?<=\D|^) 确保匹配项后面是非数字字符或字符串的开头
  • \d{16} 恰好捕获 16 位数字
  • (?=\D|$) 确保匹配项后面是非数字字符或字符串结尾

Demo

您可以使用环顾四周

(?<!\d)\d{16}(?!\d)
  • (?<!\d) - 匹配前不应有数字
  • \d{16} - 匹配数字 (0 - 9) 16 次
  • (?!\d) - 匹配后不应跟数字

Regex demo

这与您想要的很接近D\d{16}\D,除了如您指出的那样,它会抓取 16 位数字序列周围的非数字。使用 a lookbehind and a lookahead 修改它以使用非数字作为锚点,而不将它们包含在匹配中:

(?<!\d)\d{16}(?!\d)