C# 需要正则表达式查找特定模式的电话号码
可能重复:C# 需要正则表达式查找特定模式的电话号码,c#,regex,C#,Regex,可能重复: 我需要在html中查找电话号码,我在这里和google上看到了许多示例,但不确定为什么我无法找到任何一个,它根本找不到电话号码。假设html是: 基本上,我是在寻找所有美国模式的电话号码,但我发现我使用了它,但运气不佳,我使用了以下代码: 代码: 公共静态字符串提取电话(字符串html) { StringBuilder sb=新的StringBuilder() 试试看 { List tmpemail=新列表(); 字符串数据=html; //用这个模式实例化 Regex ema
我需要在html中查找电话号码,我在这里和google上看到了许多示例,但不确定为什么我无法找到任何一个,它根本找不到电话号码。假设html是: 基本上,我是在寻找所有美国模式的电话号码,但我发现我使用了它,但运气不佳,我使用了以下代码: 代码: 公共静态字符串提取电话(字符串html) { StringBuilder sb=新的StringBuilder()
试试看
{
List tmpemail=新列表();
字符串数据=html;
//用这个模式实例化
Regex emailRegex=newregex(@“(\\d{3})-(\\d{3})-(\\d{4})”,
RegexOptions.IgnoreCase);
//查找与我们的模式匹配的项目
MatchCollection emailMatches=emailRegex.Matches(数据);
foreach(在emailMatches中匹配emailMatch)
{
如果(!tmpemail.Contains(emailMatch.Value.ToLower()))
{
sb.AppendLine(emailMatch.Value.ToLower());
tmpemail.Add(emailMatch.Value.ToLower());
}
// (541) 708-1364
}
//存储到文件
}
捕获(例外情况除外)
{
}
使某人返回字符串();
}
我已经从许多示例中多次更改了该模式,但运气不佳。您正在忽略带“@”符号的转义序列,然后使用
\
转义反斜杠字符
删除多余的反斜杠或@符号,因为您的正则表达式看起来适合基本的美国电话号码
请参见此处:了解标准SO答案,以及此处:如果您还没有看到好的正则表达式站点,请参见此处。- 您使用的是字符串文字,因此您的
不会转义反斜杠。只需删除多余的斜杠,就可以匹配第一个案例'\\'
- 要处理多个案例,您必须将这些多个案例放入正则表达式中。由于您可能有一个前导父项,因此您必须通过使用
)来检查它。与尾随父项相同,您可能有0+空格或破折号,因此您需要检查or大小写,而不仅仅是-您需要\(?
(\)\s*|-)
- 您不需要在
或\d{3}
组周围使用paren,因为它是单个匹配项。这可能只是使表达更难阅读和理解\d{4}
Regex emailRegex = new Regex(@"\(?\d{3}(\)\s*|-)\d{3}-\d{4}",
RegexOptions.IgnoreCase);
我还没有对此进行过严格的测试,但我认为这是可行的
另一方面,如果您不理解正则表达式,它就是其中一种非常神秘的东西。如果您不理解表达式中的检查内容,尝试使用其他人的表达式可能会产生很差的结果。我写的也不全面。它只在这两种情况下有用。为了能够处理任何电话号码,表达式很快就会变得复杂得多。试试这个
regex
(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}
说明:
(?:子表达式)
定义非捕获组
\d
匹配任何十进制数字
|
匹配由垂直条|
字符分隔的任何一个元素
和一个示例代码:
var results = Regex.Matches(strInput, @"(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}");
但请注意:
逐字字符串文字以@开头,也用双引号括起来。例如:
@“c:\Docs\Source\a.txt”//而不是“c:\\Docs\\Source\\a.txt”
及
@“(\\d{3})-(\\d{3})-(\\d{4})”
而不是
@“(\\\\d{3})-(\\\\d{3})-(\\\\d{4})”
正如我所说,我确实使用了很多东西,包括它也不起作用,而且你也没有混淆电话和电子邮件
regex
s
var results = Regex.Matches(strInput, @"(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}");