2015-11-05 25 views
0

嘗試從混合字符值中提取美國電話號碼(以任何格式),只返回ONE或零正則表達式的結果。.net正則表達式返回2個結果,我只想要1

實施例: yyy666 555 5555yyyy1

圖案(?<!\d)\(?([\d]{3})*\)?[\s-]?[\d]{3}[\s-]?[\d]{4}(?!\d)正在返回:

「666 555 5555」, 「666」。

我不希望第二個結果「666」(僅包含區號),應該只有一個結果或結果爲零(即該示例中的回報只能是一個完整的電話號碼「 666 555 5555「或什麼都不)。

我在想什麼/我如何讓它返回0或1結果?

+0

我認爲,如果你不要第二個結果,這是捕獲組1,那麼你不應該讀它。如果你不想改變表達式,就沒有必要改變它,你可以簡單地不讀它。你的代碼是什麼樣的? – sln

+0

事實是你可能在將來某個時候需要這些部件'(?<!\ d)\(?([\ d] {3})* \)?[\ s - ]?([\ d] { 3})[\ s - ]?([\ d] {4})(?!\ d)'不需要做出不同的表達式。與往常一樣,group0是整個比賽,但您可能需要使用這些部分重新格式化,這就是我所要做的。 – sln

+0

有效的點,事實上,這正是我與之合作的開發人員所說的我們可以做的。我不是開發人員,也無法訪問代碼,因爲我只是在爲我們正在執行的(區域性)OCR項目的特定數據字段(如電話號碼,日期等)創建正則表達式。感謝一堆反饋! – Alex

回答

2

部分([\d]{3})*\)導致組捕獲,這就是您的「666」。

可避免這種情況,要麼:

(?<!\d)\(?(?:[\d]{3})*\)?[\s-]?[\d]{3}[\s-]?[\d]{4}(?!\d) 

其中(?:...)意味着非捕獲組,或者通過使用一個明確的拍攝標誌您的正則表達式:

new Regex("...", RegexOptions.ExplicitCapture); 
+0

非常感謝! – Alex

相關問題