2010-02-14 107 views
2

我有一個包含地址和電話號碼的字符串(US格式;(xxx)xxx-xxxx)。例如,.NET正則表達式 - 查找,替換

1243 K. Beverly Bld. # 223 
Los Angeles, CA 41124 
(213) 314-3221 

這是一個單一的字符串,我需要使用正則表達式提取電話號碼。我可以使用字符串標記,但有可能一些無效數據也與此字符串連接。所以我認爲使用正則表達式是找到電話號碼最簡單快捷的方法。找到電話號碼後,我需要從輸入字符串中刪除。

有人可以分享快速代碼段嗎?

+0

C#沒有正則表達式 – 2010-02-14 08:49:37

+0

@John:我的意思是我需要在C#中使用正則表達式。不過謝謝你說清楚。 – effkay 2010-02-14 13:01:02

回答

1
Match matchResults = null; 
try { 
    Regex regexObj = new Regex(@"\(?\b[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}\b"); 
    matchResults = regexObj.Match(subjectString); 
    if (matchResults.Success) { 
     // matched text: matchResults.Value 
     // match start: matchResults.Index 
     // match length: matchResults.Length 
     // backreference n text: matchResults.Groups[n].Value 
     // backreference n start: matchResults.Groups[n].Index 
     // backreference n length: matchResults.Groups[n].Length 
    } else { 
     // Match attempt failed 
    } 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 

我從RegexBuddy那裏得到了這個片段,這是RegEx的一個非常好的幫手。

+0

謝謝隊友!然而,我正在使用以下正則表達式: ((\\(\ d {3} \\)?)|(\ d {3} - ))?\ d {3} - \ d {4} – effkay 2010-02-14 08:28:30

+1

這很好,但如果未提供區號,則不起作用,如果輸入包含字母「x」後面的分機號碼(因爲\ b不會看到字邊界)也不起作用。接受地區代碼和交換中的任何數字也太混雜了 - 允許的數字在少數地方稍微受到一些限制(當然,這很挑剔,但是對於IP地址使用正則表達式,理想情況下捕獲的數字範圍應該限制在只有允許值)。 – richardtallent 2010-02-14 09:10:19

+0

@richardtallent:thanks;但主要目的是由labilbe的解決方案服務的。關於您粘貼的解決方案,它也非常棒! – effkay 2010-02-14 12:58:27

2

這將爲數字工作在美國:

^      # beginning of string, or BOL in multi-line mode 
(?:[+]?1[-. ]){0,1}  # optional calling code, not captured 
\(?      # optional common prefix for area code, not captured 
([2-9][0-8][0-9])?  # optional NANP-allowed area codes, captured in $1 
[)-. ]*     # optional common delimiters after area code, not captured 
(      # begin capture group $2 for exchange code 
    [2-9]     # first digit cannot be a 1 
    (?:[02-9][0-9]|1[02-9])) # second and third digit cannot be "11" 
)       # end capture group for exchange 
[-. ]?     # common delimiters between exchange and SN, not captured 
([0-9]{4})    # subscriber number, captured in $3 
(?:      # start non-capturing group for optional extension 
\s*(?:x|ext|ext.)\s*  # common prefixes before extension numbers 
(\d+)      # optional extension, captured in $4 
){0,1}     # end non-capturing group 
$       # end of string, or EOL in multi-line mode 

這種處理電話代碼(可選),半驗證區號(可選)和交換碼,分機號碼(可選),並捕獲每個部分的電話號碼放在一個單獨的變量中,以便於提取和操作。

使用.NET這個表情,你就需要包括IgnorePatternWhitespace和多標誌等等逗號被忽略,^$字符的字符串中的任何一行查找電話號碼。