我很难弄清楚如何提出这个问题,这可能就是为什么我还没有找到解决方案的原因。希望这个解释能让我走上正轨。
我的字符串包含一个单词(强、弱、中等),后跟一个或多个字母/数字组合。例如:
Weak: B44,45; C5
Moderate: DR1201,13,14,17,18; DP+; B44
我只想捕获单词和字母。所以对于第一行我想得到“Weak”,“B”,“C”,
第二行将是“Moderate”、“DR”、“DP”、“B”
以下简单的正则表达式:
\b(A|B|C|DP|DQ|DR)
完美地捕捉字母部分,但是当我在前面添加单词时:
(Strong|Weak|Moderate).*(A|B|C|DP|DQ|DR)
仅捕获每行的最后一个字母。我意识到这就是正则表达式的贪婪本质。使其成为惰性匹配会捕获每行的第一个字母。但是有什么方法可以让它捕获单词和每行上的所有字母吗?我忍不住认为我错过了一些东西,只是无法弄清楚。
最佳答案
你可以使用这样的东西:
(Strong|Weak|Moderate)(?:.*?\b(A|B|C|DP|DQ|DR))+
第一组将包括强
、弱
或中等
。第二组将包含多个捕获,每个捕获对应一个找到的字母。这里需要非贪婪量词以确保它不会吞噬第一组和第二组之间的任何其他字符。例如:
var input = @"
Weak: B44,45; C5
Moderate: DR1201,13,14,17,18; DP+; B44";
var pattern = @"(Strong|Weak|Moderate)(?:.*?\b(A|B|C|DP|DQ|DR))+";
var matches = Regex.Matches(input, pattern);
foreach(Match m in matches) {
Console.Write("{0}: ", m.Groups[1].Value);
foreach(Capture c in m.Groups[2].Captures) {
Console.Write("{0}, ", c.Value);
}
Console.WriteLine();
}
将产生以下输出:
Weak: B, C,
Moderate: DR, DP, B,
关于.net - 一场比赛后进行多场比赛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23157777/