2013-12-13 30 views
1

我想寫一個正則表達式,匹配從發票上的OCR數據中描述採購訂單號的任何可能的方式。這意味着我包括P.O.等可能性。或PO。當數據包含對PO Box的引用時會導致問題,這會導致「PO BOX」中的字母PO匹配。需要整個正則表達式基於負面的前瞻失敗

我曾試圖使用負向視嚮導致失敗,但我不確定是否正確。我會需要這種可能的情況下,完全無法匹配,而不是僅部分匹配。 我使用正則表達式的.NET風味,這裏是我目前使用的表達:

(?!=\s{0,3}[Bb][Oo][Xx])((([Cc]ustomer|[Cc]ust\.?) {0,5})?([Pp]\.? *[Oo]\.? *|[Pp]urchase +[Oo]rder)) *([Nn]um\.?(ber)?|[Nn]o\.?)? *#? *:? 

很不幸,這符合所有情況,包括郵政信箱的情況下,字母PO。我能做些什麼來使這種可能性失敗,只使用一個正則表達式?

回答

2

您正則表達式的第一部分看起來不正確: (?!=\s{0,3}應該(?!\s{0,3}

您也從錯誤的地方放眼望去,所以你應該將這樣的: (?!\s{0,3}[Bb][Oo][Xx])給你找到「PO」或剛過「PO」等

所以,你的正則表達式如下:

((([Cc]ustomer|[Cc]ust\.?) {0,5})?([Pp]\.? *[Oo]\.? *(?!\s{0,3}[Bb][Oo][Xx])|[Pp]urchase +[Oo]rder)) *([Nn]um\.?(ber)?|[Nn]o\.?)? *#? *:? 

還做你自己一個忙 - 除非你需要區分大小寫,使用不區分大小寫,即RegexOptions.IgnoreCase和更簡單的正則表達式:

(((Customer|Cust\.?) {0,5})?(P\.? *O\.? *(?!\s{0,3}BOX)|Purchase +Order)) *(Num\.?(ber)?|No\.?)? *#? *:? 
+0

沒有意識到它有多重要。看起來更好。這造成了一個不同的世界,非常感謝! – JNYRanger