2010-02-14 4 views
2

주소 및 전화 번호 (미국 형식, (xxx) xxx-xxxx)가 포함 된 문자열이 있습니다. 예 :.NET 정규식 - 찾기, 바꾸기

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

이것은 단일 문자열이며 정규식을 사용하여 전화 번호를 추출해야합니다. 나는 문자열 토큰을 사용할 수 있었지만 일부 잘못된 데이터가이 문자열과 연결될 가능성이 있습니다. 그래서 정규식을 사용하는 것이 전화 번호를 찾는 가장 쉽고 빠른 방법 일 것이라고 생각합니다. 전화 번호를 찾은 후에 입력 문자열에서 제거해야합니다.

누군가가 빠른 코드 스 니펫을 공유 할 수 있습니까?

+0

C#에는 정규식이 없습니다. –

+0

@ 존 : 저는 C#에서 정규 표현식을 사용해야한다는 것을 의미했습니다. 그러나 일을 분명히 해주셔서 감사합니다. – effkay

답변

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 
} 

RegEx를위한 아주 좋은 도우미 인 RegexBuddy에서이 스 니펫을 받았습니다.

+0

감사합니다. 그러나 다음 정규식을 사용하고 있습니다 : ((\\ (\ d {3} \\)?) (\ d {3} -))? \ d {3} - \ d {4} – effkay

+1

지역 코드가 제공되지 않으면 작동하지 않으며 입력에 문자 "x"다음에 내선 번호가 포함되어 있으면 작동하지 않습니다 ('\ b'는 단어 경계가 표시되지 않으므로). 지역 번호와 교환에있는 숫자를 수락하는 것은 너무 난잡합니다. 허용되는 숫자는 몇 군데에서 약간 더 제한적입니다. (물론, 까다 롭지 만 정규식을 IP 주소로 사용하는 것과 같이 숫자 범위는 이상적으로 제한되어야합니다. 허용되는 값만). – richardtallent

+0

@richardtallent : 감사합니다. 그러나 주요 목적은 labilbe의 해결책에 의해 제공되었습니다. 붙여 넣은 솔루션에 대해서도 멋지 네요! – effkay

2

이것은 US의 수치 작동은 :

^      # 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 및 MultiLine 플래그를 포함해야합니다.