.net - 一场比赛后进行多场比赛

标签 .net regex

我很难弄清楚如何提出这个问题,这可能就是为什么我还没有找到解决方案的原因。希望这个解释能让我走上正轨。

我的字符串包含一个单词(强、弱、中等),后跟一个或多个字母/数字组合。例如:

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/

相关文章:

c# - 为什么 Entity Framework 在不同的 AppDomain 中运行时速度明显变慢?

.net - 来自 .Net 的 Windows 菜单

c# - 如何在C#中设置系统环境变量?

.net - 如何在 Linux 环境下运行 .net 应用程序?

ruby-on-rails - 您如何针对多个正则表达式进行验证?

swift - 如何在多行上进行正则表达式搜索?

c# - 从列表对象的列表字段中删除元素的最佳方法

java正则表达式,仅当不在引号或括号中时才以逗号分隔

mysql - 在 MYSQL 中出现数字之前,如何获取字符串的前 1 或 2 个字符?

java - 使用正则表达式选择 3 个字母的单词