我需要在html中找到电话号码,我在这里和谷歌上看过很多例子,但不确定为什么我不能让任何人工作,它根本找不到号码。假设html是:
基本上我打算使用所有美国模式电话号码,但是我发现我使用它的任何东西但没有运气我使用此代码:
CODE: public static string Extractphone(string html) { StringBuilder sb = new StringBuilder();
try
{
List<string> tmpemail = new List<string>();
string data = html;
//instantiate with this pattern
Regex emailRegex = new Regex(@"(\\d{3})-(\\d{3})-(\\d{4})",
RegexOptions.IgnoreCase);
//find items that matches with our pattern
MatchCollection emailMatches = emailRegex.Matches(data);
foreach (Match emailMatch in emailMatches)
{
if (!tmpemail.Contains(emailMatch.Value.ToLower()))
{
sb.AppendLine(emailMatch.Value.ToLower());
tmpemail.Add(emailMatch.Value.ToLower());
}
// (541) 708-1364
}
//store to file
}
catch (Exception ex)
{
}
return sb.ToString();
}
我已经从许多例子中多次改变了模式,但没有运气。
答案 0 :(得分:0)
您忽略了带有'@'符号的转义序列,然后使用\\
来转义反斜杠字符。
删除无关的反斜杠或@符号,因为你的正则表达式看起来正确的美国电话号码。
请参阅此处:A comprehensive regex for phone number validation获取标准SO答案,此处:http://regexlib.com/Search.aspx?k=US%20Phone%20number代表一个优秀的正则表达式网站,如果您还没有看到它们。
答案 1 :(得分:0)
'\\'
无法转义反斜杠。只需删除额外的斜线即可让您匹配第一个案例\(?
来检查它。与你可能有的那个和0+空格或破折号相同,所以你需要检查或案例而不仅仅是 - 你需要(\)\s*|-)
\d{3}
或\d{4}
组周围的parens,因为它只是一个匹配。这可能只是让表达更难阅读和理解因此,为您的正则表达式初始化留下了以下内容
Regex emailRegex = new Regex(@"\(?\d{3}(\)\s*|-)\d{3}-\d{4}",
RegexOptions.IgnoreCase);
我没有对此进行过强有力的测试,但我认为这很有效。
作为旁注,正则表达式是那些如果你不理解它们就会非常神秘的东西之一。如果你实际上没有理解表达式中正在检查的内容,那么试图仅仅采取其他人的表达并使用它可能会产生不良结果。我在那里写的也不全面。它只适用于这两种情况。为了能够处理任何电话号码,表达式会变得更加复杂。
答案 2 :(得分:0)
试试这个regex
(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}
解释
的
(?:subexpression)
强> 的 定义一个非捕获组。的
\d
强> 的 匹配任何十进制数字。的
|
强> 的 匹配由竖线|
字符分隔的任何一个元素。
和示例代码:
var results = Regex.Matches(strInput, @"(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}");
但请注意:
逐字字符串文字以@开头,并且也用双引号括起来。例如:
@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"
和
@"(\\d{3})-(\\d{3})-(\\d{4})"
rather than
@"(\\\\d{3})-(\\\\d{3})-(\\\\d{4})"