从文本中提取数字组

时间:2013-05-08 17:20:39

标签: .net regex

有这样的文字

Above includes - Add/Remove Member To/From Nested Group - 1.24.12 / 1.24.13

如何创建一个正则表达式,返回我拥有的2组3个数字。 预期结果

1.24.12
1.24.13

我尝试使用这样的表达式

private static Regex MRDNumbers = new Regex(@"((\d+.?){2,})+");

但它根本不起作用。

此外,组的长度可以不同,也可以是

1.22
13.4.7
1.2.3.4
1.2.3.4.5
1.2.3.4.5.6

5 个答案:

答案 0 :(得分:2)

问题在于您的模式中的.。在正则表达式语言中,.字符匹配任何字符(单行模式除外),因此您必须使用\字符对其进行转义才能匹配句点。

请改为尝试:

private static Regex MRDNumbers = new Regex(@"((\d+\.?){2,})+");

要捕获列表中的所有匹配数字,您可以尝试:

private Regex MRDNumbers = new Regex(@"(\d+?)(?:\.(\d+))+");

string input = "Above includes - Add/Remove Member To/From Nested Group - 1.24.12 / 1.24.13";
MRDNumbers.Matches(input).Cast<Match>().Dump();
var list = 
    (from m in MRDNumbers.Matches(input).Cast<Match>()
     select 
     from g in m.Groups.Cast<Group>().Skip(1)
     from c in g.Captures.Cast<Capture>()
     select c.Value)
    .ToList(); 
// [ [ 1, 24, 12 ], [ 1, 24, 12 ] ]

或者用流利的语法:

var list = 
    MRDNumbers.Matches(input).Cast<Match>()
              .Select(m => m.Groups.Cast<Group>()
                            .Skip(1)
                            .SelectMany(g => g.Captures.Cast<Capture>())
                            .Select(c => c.Value))
              .ToList();

答案 1 :(得分:1)

好的,问题解决了,我确实在C#中使用了错误的想法。这是正确的代码

private static Regex MRDNumbers = new Regex(@"((\d+\.?){2,})+");
static void Main(string[] args)
{
    string s = " Above includes - Add/Remove Member To/From Nested Group - 1.24.12 / 1.24.13.45 45.78";
    MatchCollection m = MRDNumbers.Matches(s);

    foreach (Match match in m)
    {
        Debug.WriteLine(match.Value);
    }
}

答案 2 :(得分:0)

尝试转义.

((\d+\.?){2,})+

请注意,.现在是\.。似乎是working in regexpal

答案 3 :(得分:0)

您可以使用此正则表达式

\d+(\.\d+)+

您可以使用此代码

获取此类数字的列表
List<String> lst=Regex.Matches(input,regex)
                      .Cast<Match>()
                      .Select(x=>x.Value);

答案 4 :(得分:0)

您需要逃离您的点和其中一个组。你离开1.24.12 12的原因是12是填补第2组的最后一场比赛,所以你得到了那个吐出来。

试试这个:

private static Regex MRDNumbers = new Regex(@"((?:\d+\.?){2,})+");