奇数正则表达式

时间:2013-12-17 23:09:57

标签: regex

我想在perl中创建一个正则表达式,它可以在给定的文本文件中找到SSN,而不匹配前面有特定文本的九位数字。我的表达:

(?!.*X-MICROSOFT-CDO-OWNERAPPTID:-?)^.*(\b(?!000)(?!666)(?!9)[0-9]{3}[ -]?(?!00)[0-9]{2}[ -]?(?!0000)[0-9]{4}\b)

我想忽略的是: X-MICROSOFT-CDO-OWNERAPPTID:-444444444

X-MICROSOFT-CDO-OWNERAPPTID:444444444

但我希望除了该文本之外还要匹配任何可能的SSN。使用上面的表达式,它将匹配有效SSN之前的所有内容。有什么建议? enter image description here

2 个答案:

答案 0 :(得分:0)

它与ddd匹配,因为模式中的^.*匹配从字符串开头到SSN的所有内容。如果你想只是 SSN,你必须从匹配中提取第一个捕获组。确切地说,这取决于您正在使用的语言/平台。

您可能还想考虑使用负面的lookbehind,如下所示:

(?<!X-MICROSOFT-CDO-OWNERAPPTID:-?)(\b(?!000|666|9)[0-9]{3}[ -]?(?!00)[0-9]{2}[ -]?(?!0000)[0-9]{4}\b)

但这也很大程度上取决于您使用的平台。例如,JavaScript根本不支持lookbehinds。

答案 1 :(得分:0)

由于所使用的程序显然不允许从匹配中提取捕获组,但总是进行完全匹配,因此p.s.w.g使用负面后视的想法很好。但是,指定的后视(?<!X-MICROSOFT-CDO-OWNERAPPTID:-?)可能无效,因为PCRE不允许具有非固定宽度的后视镜。幸运的是,在这种情况下,我们可以使用两个固定宽度的lookbehinds而不是上面的(一个有一个而没有-):

(?<!X-MICROSOFT-CDO-OWNERAPPTID:-)(?<!X-MICROSOFT-CDO-OWNERAPPTID:)…
相关问题