比赛结束后的多场比赛

时间:2014-04-18 16:02:19

标签: .net regex

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

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

Weak: B44,45; C5

Moderate: DR1201,13,14,17,18; DP+; B44

我只想捕捉单词和字母。所以对于第一行,我想得到“弱”,“B”,“C”,

,第二行是“中等”,“DR”,“DP”,“B”

以下简单的正则表达式:

\b(A|B|C|DP|DQ|DR)

完美地捕捉字母部分,但是当我在前面加上单词:

(Strong|Weak|Moderate).*(A|B|C|DP|DQ|DR)

仅捕获每行上的最后一个字母。我意识到这是正则表达式的贪婪本质。使它成为一个懒惰的匹配捕获每行的第一个字母。但有没有什么方法可以让它捕获每行上的字母和所有字母?我不禁想到我错过了什么,只是想不出来。

3 个答案:

答案 0 :(得分:4)

您可以使用以下内容:

(Strong|Weak|Moderate)(?:.*?\b(A|B|C|DP|DQ|DR))+

第一组将包含StrongWeakModerate。第二组将包含多个捕获,每个捕获一个字母。这里的非贪婪量词需要确保它不会吞掉第一组和第二组之间的任何其他字符。例如:

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,

答案 1 :(得分:0)

您可以匹配所有字母:

\b[A-Za-z]+

你应该得到所有字母的数组。

\b确保之前没有其他字母或数字(或下划线,因为它是\w类的一部分)。

regex101 demo

在代码中:

string input = @"
Weak: B44,45; C5

Moderate: DR1201,13,14,17,18; DP+; B44
";
string[] lines = input.Split(new Char [] {'\n'});
var reg = new Regex(@"\b[A-Z]+", RegexOptions.IgnoreCase);

/// Using RegexOptions.IgnoreCase lets you use [A-Z]+ just the same way as
/// [A-Za-z]+

foreach (String line in lines)
{
    if (line == "")
    {
        continue;
    }
    var words = reg.Matches(line)
                   .OfType<Match>()
                   .Select(m => m.Value)
                   .ToList();
    Console.WriteLine(string.Join(", ", words.ToArray()));
}

输出:

Weak, B, C
Moderate, DR, DP, B

demo on ideone

答案 2 :(得分:-2)

问题不清楚......但这可能会有所帮助:

\b[a-zA-z]+\.[a-zA-z]+