正则表达式目前在atm中处于领先地位,无法弄清楚如何从单个字符串中获取多个匹配组,同时保持单词结果分离。
例如,我有一个字符串'GeForce TURBO-GTX1080-8G NVIDIA'。
我想在字符串中找到每组数字(我知道\ d达到小数匹配)。 IE浏览器。 1080和8(或者如果我能用环绕声文本找到它们,那就更好了(GTX1080& 8G)。
然后我希望能够将它们从匹配中拉出来并将它们与另一个字符串进行比较,但我希望每个单词/匹配分开进行比较。
IE中。我想对不同的字符串运行相同的匹配,例如'GeForce TURBO-GTX1070-4G'(将返回1070和4等)并将匹配进行比较。
如果我似乎使用群组,即。 (\ d)(\ d \ s),匹配似乎没有成功。
我环顾四周寻找答案并看到了这样的帖子......
和regexstorm.net一起玩,但是仍然有问题做出额外的步骤。
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
你似乎在寻找
GeForce\s+\w+-(\w+)-(\w+)
模式说明:
GeForce
- 文字子串GeForce
\s+
- 一个或多个空格\w+-
- 1个单词字符和连字符(\w+)
- 第1组捕获1个字的字符-
- 一个连字符
- (\w+)
- 第2组捕获1个字的字符要访问这些群组,请使用Match.Groups[X].Value
。
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 demo。 The code将与上述相同。
此处,\w+
替换为匹配的[^\W\d]*(\d+)[^\W\d]*
:
[^\W\d]*
- 除了数字(即[\p{L}_]
或[\w-[\d]]
)(\d+)
- 捕获一个或多个数字的组X [^\W\d]*
- 同上。