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

我有一个巨大的文本文件,里面有很多这样的行。有人可以帮助我如何构建正则表达式以便我可以提取数字'800000000'吗?

from 和 to 电话号码将不同

我总是需要后面的数字to

目前我在空白处分割线,然后遍历我觉得效率很低的数组。

4

4 回答 4

1

首先你必须得到to-Number的整个匹配:

, 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;
}
于 2012-04-24T17:28:01.553 回答
0

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

于 2012-04-24T16:41:31.557 回答
0

这行得通。我不确定你的输入有多大的变化......

        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];
于 2012-04-24T16:51:54.593 回答
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() 针对此模式运行整个文件,您可以使用以下代码生成“to”数字列表:

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

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

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

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

于 2012-04-24T17:00:12.783 回答