【问题标题】:Detect Multiple Account Numbers Using Regex Groups使用正则表达式组检测多个帐号
【发布时间】:2019-08-20 17:49:23
【问题描述】:

我的高级副总裁希望我更新电子邮件系统上的正则表达式规则,以更好地检测美国银行帐号。问题是美国的银行帐号没有标准化,它们可以在 6 到 17 位之间。

我们目前使用限定词来检测我们已确定需要屏蔽的特定字符串。我们目前的规则是这样的变体:

(?i)bank\saccount\s[0-9]{6,17}

我需要解决的问题是需要检测数字,即使它们前面或后面带有bank account。我知道我可以找到一个这样的例子:

(?=.*?(bank\saccount))(?=.*?(\d{6,17}))

但我的 SVP 还希望能够检测特定消息中的帐号数量。我尝试使用贪婪量词添加第三个捕获组,以便它抓取与第二个不同的数字:

(?=.*?(bank\saccount))(?=.*?(\d{6,17}))(?=.*(\d{6,17}))

这是一个包含几个示例的沙盒: https://regex101.com/r/hqIEaR/3

我是正则表达式的新手,有没有办法设置此表达式以在字符串“银行帐户”存在的消息中返回等于 6-17 位数字实例的匹配数?

【问题讨论】:

  • 如果正则表达式风格是 .NET,请使用 (?is)(?<=\bbank\saccount\b.*?)\b\d{6,17}\b|\b\d{6,17}\b(?=.*?\bbank\saccount\b),参见 demo
  • 不幸的是,我的电子邮件设备需要 PCRE 正则表达式。看起来该设备在后视镜中的量词存在问题。
  • 你确定是PCRE吗?然后(?is)(?:\G(?!\A)|\A(?=.*\bbank\saccount\b)).*?\K\b\d{6,17}\b 必须工作。请参阅 ????????????????.
  • @WiktorStribiżew,谢谢!这非常有效!

标签: regex pcre regex-group


【解决方案1】:

也许越简单越好:

(?<=\D|^)\d{6,17}(?=\D|$)

测试here

我们的想法是找到所有 6..17 位的数字。它们可能是帐号。

问题是寻找“银行账户”是没有用的。你的说法是:

我需要解决的问题是需要检测数字即使它们不是以“银行帐户”为前缀的

因此,如果该字符串 可能可能不 存在,请完全忽略它。

如何区分帐号和 SSN?这是另一个问题的主题。


如果必须找到"bank account" AND 数字,但它们之间没有明确的关系(考虑到它们在文本中的位置),我实际上会使用两个搜索:

  1. 搜索bank account
  2. 如果第一次搜索成功,则第二次搜索数字。

我希望(没有证据)它会比完全使用正则表达式更快,因为很多事情根本不会完成。

【讨论】:

  • 不,在regex101.com/r/qbnNj9/2 上查看您的(?&lt;=\D|^)\d{6,17}(?=\D|$) 测试,即使字符串内部没有bank account,数字也会匹配。请参阅 OP:有没有办法设置此表达式以返回与消息中 6-17 位数字实例相等的匹配数字符串“银行帐户”存在 ?
  • 我在回答中特别引用了关于该问题的 OP:even if they are not prepended by "bank account "
  • 这意味着bank account 必须在数字之后的某个位置。 bank account 必须在字符串中,否则匹配无效。
  • 虽然我认为它模棱两可,但您的评论有其优点。我用我的做事方式更新了答案——我是否需要这个搜索。
【解决方案2】:

由于您使用的是与 PCRE 兼容的引擎,因此您可以使用类似的正则表达式

(?is)(?:\G(?!\A)|\A(?=.*\bbank\saccount\b)).*?\K\b\d{6,17}\b

请参阅regex demo

  • (?is) - 不区分大小写和单行/全点模式
  • (?:\G(?!\A)|\A(?=.*\bbank\saccount\b)) - 上一个匹配的结尾或字符串的开头 (\A),在当前位置右侧的任何位置都有一个 blank account 整个单词((?=.*\bbank\saccount\b) 正向前瞻)
  • .*? - 任何 0+ 个字符,尽可能少
  • \K - 匹配重置运算符,将匹配的文本从整体匹配内存缓冲区中丢弃
  • \b\d{6,17}\b - 6 到 17 位数字匹配为整个单词(两端不能出现其他字母、数字或 _ 字符)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多