2

有这样的文字

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
4

5 回答 5

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();
于 2013-05-08T17:23:53.740 回答
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);
    }
}
于 2013-05-08T17:33:57.630 回答
0

尝试逃避你的.

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

请注意,.现在是\.. 似乎在 regexpal 中工作

于 2013-05-08T17:23:04.743 回答
0

你可以使用这个正则表达式

\d+(\.\d+)+

您可以使用此代码获取此类数字的列表

List<String> lst=Regex.Matches(input,regex)
                      .Cast<Match>()
                      .Select(x=>x.Value);
于 2013-05-08T17:23:27.080 回答
0

你需要逃离你的点和其中一个群体。您出局的原因1.24.12 12是那12是第 2 组的最后一场比赛,所以您会被淘汰。

试试这个:

private static Regex MRDNumbers = new Regex(@"((?:\d+\.?){2,})+");
于 2013-05-08T17:31:46.780 回答