c#匹配多个正则表达式组,保持每个匹配/单词分开

时间:2016-07-17 20:32:15

标签: c# .net regex

正则表达式目前在atm中处于领先地位,无法弄清楚如何从单个字符串中获取多个匹配组,同时保持单词结果分离。

例如,我有一个字符串'GeForce TURBO-GTX1080-8G NVIDIA'。

我想在字符串中找到每组数字(我知道\ d达到小数匹配)。 IE浏览器。 1080和8(或者如果我能用环绕声文本找到它们,那就更好了(GTX1080& 8G)。

然后我希望能够将它们从匹配中拉出来并将它们与另一个字符串进行比较,但我希望每个单词/匹配分开进行比较。

IE中。我想对不同的字符串运行相同的匹配,例如'GeForce TURBO-GTX1070-4G'(将返回1070和4等)并将匹配进行比较。

如果我似乎使用群组,即。 (\ d)(\ d \ s),匹配似乎没有成功。

我环顾四周寻找答案并看到了这样的帖子......

Multiple Group Matches

和regexstorm.net一起玩,但是仍然有问题做出额外的步骤。

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

你似乎在寻找

GeForce\s+\w+-(\w+)-(\w+)

regex demo is available here

模式说明

  • GeForce - 文字子串GeForce
  • \s+ - 一个或多个空格
  • \w+- - 1个单词字符和连字符
  • (\w+) - 第1组捕获1个字的字符
  • - - 一个连字符 - (\w+) - 第2组捕获1个字的字符

要访问这些群组,请使用Match.Groups[X].Value

C# demo:

var re = @"GeForce\s+\w+-(\w+)-(\w+)"; 
var str = "GeForce TURBO-GTX1080-8G NVIDIA\nGeForce TURBO-GTX1070-4Gi"; 
var res = Regex.Matches(str, re)
        .Cast<Match>()
        .Select(m => m.Groups.Cast<Group>().Skip(1).Select(g => g.Value) )
        .ToList();
foreach (var m in res)
    Console.WriteLine(string.Join(" : ", m));

如果您还需要匹配数字,请使用

GeForce\s+\w+-([^\W\d]*(\d+)[^\W\d]*)-([^\W\d]*(\d+)[^\W\d]*)

this regex demoThe code将与上述相同。

此处,\w+替换为匹配的[^\W\d]*(\d+)[^\W\d]*

  • [^\W\d]* - 除了数字(即[\p{L}_][\w-[\d]]
  • 之外的零个或多个字词字符
  • (\d+) - 捕获一个或多个数字的组X
  • [^\W\d]* - 同上。

enter image description here