我想在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之前的所有内容。有什么建议?
答案 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:)…