Регулярные выражения .NET - поиск, замена - PullRequest
2 голосов
/ 14 февраля 2010

У меня есть строка, содержащая адрес и номер телефона (формат США; (xxx) xxx-xxxx). Например.,

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

Это одна строка, мне нужно извлечь номер телефона из нее с помощью регулярных выражений. Я мог бы использовать строковые токены, но есть вероятность, что некоторые неверные данные также будут объединены с этой строкой. Поэтому я думаю, что использование регулярных выражений было бы самым простым и быстрым способом найти номер телефона. После нахождения номера телефона мне нужно убрать из строки ввода.

Может, кто-нибудь поделится фрагментом быстрого кода?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2010

Это будет работать для номеров в США:

 ^                         # 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, чтобы запятые игнорировались, а символы ^ и $ находили номера телефонов в любой строке строки.

1 голос
/ 14 февраля 2010
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...