我有一个包含地址和电话号码的字符串(美国格式;(xxx)xxx-xxxx)。如,
1243 K. Beverly Bld. # 223
Los Angeles, CA 41124
(213) 314-3221
这是一个单字符串,我需要使用正则表达式从中提取电话号码。我本来可以使用字符串标记,但有些无效数据也可能与此字符串连接。因此,我认为使用正则表达式将是查找电话号码的最简单,最快捷的方式。找到电话号码后,我需要从输入字符串中删除。
有人可以分享快速代码段吗?
答案 0 :(得分: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和MultiLine标志,以便忽略逗号,^
和$
个字符在字符串中的任何一行上找到电话号码。
答案 1 :(得分: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的一个非常好的帮手。