2013-12-17 60 views
-1

我想在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

+0

什麼是假陽性,我們都應該被解決? – tripleee

+0

對不起,我解釋了導致我創建這個正則表達式的問題。我實際上只是想知道爲什麼這個正則表達式匹配「ddd」 –

+0

我認爲這是因爲這個部分'^。*'它不是一個否定,因爲它是在小組比賽之後(前瞻否定)你說的該行應該從任何東西開始。 –

回答

0

它匹配ddd因爲在你的模式^.*是從字符串到SSN的開頭匹配一切。如果你想得到只是 SSN,你必須從比賽中提取第一個捕獲組。正是你如何做到這一點取決於你使用的語言/平臺。

您也可能要考慮使用負回顧後,像這樣:

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

但是這也取決於你所使用的平臺很多。例如,JavaScript根本不支持向後看。

+0

如果你將連字符從lookbehind中取出,它將以任何支持它們的方式工作:'(?<!X-MICROSOFT-CDO-OWNERAPPTID:) - ?'。這仍然允許在第一個數字之前使用連字符。我假設沒關係,只要連字符不在其他東西之前。 ('\ b'也可以。) –

+0

文檔中說Perl兼容的正則表達式,所以我猜測Perl。 –

+1

你不確定你想在哪個環境中工作?這是一個新的。 – tripleee

0

由於使用的程序顯然不允許從匹配中提取捕獲組,但總是採用完全匹配,因此p.s.w.g使用負向倒序的想法很好。雖然,指定的後視(?<!X-MICROSOFT-CDO-OWNERAPPTID:-?)可能無法正常工作,因爲PCRE不允許使用非固定寬度的lookbehind。幸運的是這種情況下,我們可以使用兩個固定寬度lookbehinds代替上述(一種帶有一個沒有-):

(?<!X-MICROSOFT-CDO-OWNERAPPTID:-)(?<!X-MICROSOFT-CDO-OWNERAPPTID:)…