C# 从网页解析国际电话号码
我正在使用HtmlAgilityPack解析网页。加载文档后,我想从HTML中提取可能的电话号码。目前,我正在为此使用一些正则表达式。我有下面一段代码,用于检查网页中的电话号码是否匹配C# 从网页解析国际电话号码,c#,regex,html-agility-pack,phone-number,C#,Regex,Html Agility Pack,Phone Number,我正在使用HtmlAgilityPack解析网页。加载文档后,我想从HTML中提取可能的电话号码。目前,我正在为此使用一些正则表达式。我有下面一段代码,用于检查网页中的电话号码是否匹配 private static string phoneReg = @"[\+]{0,1}(\d{10,13}|[\(][\+]{0,1}\d{2,}[\13)]*\d{5,13}|\d{2,6}[\-]{1}\d{2,13}[\-]*\d{3,13})";
private static string phoneReg =
@"[\+]{0,1}(\d{10,13}|[\(][\+]{0,1}\d{2,}[\13)]*\d{5,13}|\d{2,6}[\-]{1}\d{2,13}[\-]*\d{3,13})";
private static Regex phoneRegex = new Regex(phoneReg, RegexOptions.IgnoreCase);
var phoneMatches = phoneRegex.Matches(doci.DocumentNode.InnerText);
其中doci
是HtmlDocument
对html敏捷包的抽象。问题是它无法匹配某些电话号码,如08450 211 211
和+44(0)1246 733 000
有没有一个通用的正则表达式最适合抓取网站,它允许匹配大多数形式的国际电话号码?您无法匹配这些电话号码(
08450 211
和+44(0)1246 733 000
),因为您的正则表达式根本不匹配它们
编写正则表达式时必须做的第一件事是识别要匹配的模式
因此,我的建议是写下不同电话号码格式的列表,更新您的问题,然后我们将能够帮助您。否则,我将始终创建一个新的电话号码,您的正则表达式可能不匹配,或者它将只匹配超过您想要的
下面是一个与上述电话号码匹配的正则表达式:
(?:\+\d+\s+\(\d+\)\s+)?\d{4,5}\s+\d{3}\s+\d{3}
(?:\+\d+\s+\(\d+\)\s+)?[\d -]+
编辑:
根据您的评论,我只会使用这个正则表达式,然后删除那些不是电话号码的:
(?:\+\d+\s+\(\d+\)\s+)?\d{4,5}\s+\d{3}\s+\d{3}
(?:\+\d+\s+\(\d+\)\s+)?[\d -]+
您无法匹配这些电话号码(
08450 211 211
和+44(0)1246 733 000
),因为您的正则表达式根本不匹配
编写正则表达式时必须做的第一件事是识别要匹配的模式
因此,我的建议是写下不同电话号码格式的列表,更新您的问题,然后我们将能够帮助您。否则,我将始终创建一个新的电话号码,您的正则表达式可能不匹配,或者它将只匹配超过您想要的
下面是一个与上述电话号码匹配的正则表达式:
(?:\+\d+\s+\(\d+\)\s+)?\d{4,5}\s+\d{3}\s+\d{3}
(?:\+\d+\s+\(\d+\)\s+)?[\d -]+
编辑:
根据您的评论,我只会使用这个正则表达式,然后删除那些不是电话号码的:
(?:\+\d+\s+\(\d+\)\s+)?\d{4,5}\s+\d{3}\s+\d{3}
(?:\+\d+\s+\(\d+\)\s+)?[\d -]+
我已经尝试了许多来自的正则表达式模式,但它们没有达到目的。对不起,这听起来很恶意。(在许多网站上爬行并提取电话号码)。你介意解释一下你为什么这么做吗?这是关于收集我们网站上关于分销商的一些信息。我们只是从db网站上读到了他们的联系方式,我甚至可以设置更多的正则表达式。我已经尝试了许多正则表达式模式,但它们都没有达到目的。对不起,这听起来很恶意。(在许多网站上爬行并提取电话号码)。你介意解释一下你为什么这么做吗?这是关于收集我们网站上关于分销商的一些信息。我们只是从db网站上读到了他们的联系方式,我甚至可以设置更多的正则表达式。我只想一个接一个地匹配他们。如果有人对这个问题有疑问的话,我想从不同分销商的网站上提取电话号码,所以要提供一个精确的数据集是非常困难的。什么,我想要的是一个正则表达式模式,匹配大多数国际电话号码模式。假阳性在某种程度上是可以容忍的。除非他们开始将文本或html声明为电话号码。在分析文档中是否存在电话号码时,添加
^
将强制仅在文档开头进行匹配。类似地,在文档末尾添加$
将强制仅在文档末尾进行匹配。这是真的还是我误读了正则表达式的含义works@MuhammadAdeelZahid请参阅我的编辑。我认为您可以使用该正则表达式,然后手动删除不正确的数字,因为会有不正确的数字(比如这个日期:2010-10-10
,等等)。一旦你有了一个长的列表,也许你可以根据它们的格式对数字进行分组,并编写一个更具体的正则表达式。的含义是什么?:
在正则表达式中?这意味着不要捕获这个组。它已匹配,但未放置在组列表中。在这种情况下,它可能可以省略。你可以根据你想在每个组中捕获的内容来调整括号。事实上,我想从不同分销商的网站中提取电话号码,因此要获得准确的数据集是非常困难的。什么,我想要的是一个正则表达式模式,匹配大多数国际电话号码模式。假阳性在某种程度上是可以容忍的。除非他们开始将文本或html声明为电话号码。在分析文档中是否存在电话号码时,添加^
将强制仅在文档开头进行匹配。类似地,在文档末尾添加$
将强制仅在文档末尾进行匹配。这是真的还是我误读了正则表达式的含义works@MuhammadAdeelZahid请参阅我的编辑。我认为您可以使用该正则表达式,然后手动删除不正确的数字,因为会有不正确的数字(比如这个日期:2010-10-10
,等等)。一旦你有了一个长的列表,也许你可以根据它们的格式对数字进行分组,并编写一个更具体的正则表达式。的含义是什么?:
在正则表达式中?这意味着不要捕获这个组。它已匹配,但未放置在组列表中。在这种情况下,它可能可以省略。可以根据要在每个组中捕获的内容调整括号。