2012-04-24 73 views
1
<CallInfo info: from '600000000', to '800000000', forwardedFrom '', display '', category '1', tollCategory '2',callingNumberRestricted false, custom '', receivingComplete true> -- (SUCCESS) 

我有一个很大的文本文件,有很多这样的行。有人可以帮助我如何建立正则表达式,以便我可以提取数字'800000000'正则表达式提取电话号码

从和到的电话号码将是不同

我总是需要它由to

follwed目前我分割线在空的空间,然后通过数组,我觉得是非常低效的迭代次数。

+1

如果你知道到底是什么性质的电话号码开始和结束对于每一行,那么这可能比正则表达式更有效。 – vcsjones 2012-04-24 16:40:47

+0

@vcsjones:同意;如果所有线路看起来都像这样,那么至少可以通过电话号码将其视为固定长度。 – KeithS 2012-04-24 16:44:07

+0

nope。除此之外还有许多其他线路。我只对这种格式的行感兴趣。 – Sandeep 2012-04-24 16:44:59

回答

0

尝试to '(\d{9})。这将匹配文本to '之后的连续9位数字序列,并将结果存储在第一个捕获组中。

+0

这将匹配从和数字。这个问题明确地说只有数字应该匹配。 – 2012-04-24 16:53:52

+0

对不起,我编辑了我的回复 – LukeGT 2012-04-24 16:58:28

0

This Works。我不知道你的输入是如何变化的...

 string s = "<CallInfo info: from '600000000', to '800000000', forwardedFrom '', display '', category '1', tollCategory '2',callingNumberRestricted false, custom '', receivingComplete true> -- (SUCCESS)"; 

     Regex r = new Regex("^<CallInfo.* to '(\\d{9})'"); 
     var match = r.Match(s); 
     var number = match.Groups[1]; 
+0

(话虽如此,我不知道它比分割线更有效率,正则表达式并不完全是效率模型) – Shlomo 2012-04-24 16:53:19

+1

您并不需要第一个和第三个捕获组,你可以简单地使用:'“^ sch 2012-04-24 16:54:23

+0

谢谢。用这些更新编辑。 – Shlomo 2012-04-24 17:00:27

0

看起来够简单。我会从文件中取出一个“样本”行,并将其转换为正则表达式,用指明您感兴趣的数据类型的特殊字符来标记和替换真实数据。具体来说,您说要捕获“to “电话号码:

@"^<CallInfo info: from '\d{1,9}', to '(?<toNumber>\d{1,9})', forwardedFrom '.*?', display '.*?', category '.*?', tollCategory '.*?', callingNumberRestricted (?:true|false), custom '.*?', receivingComplete (?:true|false)> -- \(SUCCESS\)$" 

运行反对使用Regex.Match()这个模式整个文件,就可以生产出名单‘到’数字与下面的代码:

List<string> toNumbers = Regex.Match(contentsOfFile, pattern).Groups["toNumber"].ToList(); 

你可以通过简单的解析将数字转换为实际数值:

List<ulong> toNumbersAsLongs = toNumbers.Select(s=>ulong.Parse(s)).ToList(); 

如果您需要此文件中的任何其他数据,只需使用圆括号将该字段包装在该模式中,并使用?<captureName>约定为其命名。

0

首先你必须得到的对数的整场比赛:

, to '[0-9]{9}', 

之后,你必须从比赛得到一组。你最好带一组命名如下:

, to '(?<toNumber>[0-9]{9})', 

用于获取电话号码,以看起来是这样的一种实现:

string regex = ", to '(?<toNumber>[0-9]{9})',"; 
string text = "<CallInfo info: from '600000000', to '800000000', forwardedFrom '', display '', category '1', tollCategory '2',callingNumberRestricted false, custom '', receivingComplete true> -- (SUCCESS)"; 
string toNumber = string.Empty; 

Match match = Regex.Match(text, regex); 
if (match.Success) 
{ 
    toNumber = match.Groups["toNumber"].Value; 
}