c# - "Tight"重复键/值匹配

标签 c# regex

具有键/值对“紧密”重复模式的字符串(对于此示例,键是“name”,值应该是单个小写单词)

string text = "name: abc name: def name: ghi name: jkl";

应该转化为输出

abc, def, ghi, jkl,

而模式中的任何干扰(可以说是“非紧”)

string text = "name: abc x name: def name: ghi name: jkl";

应该会导致匹配失败,类似于

abc, ## Exception occurred: x cannot be matched to the pattern ##

我试过了

string text = "name: abc name: def name: ghi name: jkl";
string pattern = @"name:\s*([a-z])*\s*";

MatchCollection ms = Regex.Matches(text, pattern);

foreach (Match m in ms)
{
    Console.Write(m.Groups[1].Value+", ");
}

但它返回

c, f, i, l,

是什么导致了这种奇怪的行为,我该如何解决?

最佳答案

您只需将 * 移到括号内即可捕获完整字符串。如果你想防止无效输入,那么正则表达式并不是绝对必要的。这假设您的值不能有空格,因为这将是一个更难解决的问题。

void Main()
{
    string validText = "name: abc name: def name: ghi name: jkl";
    string invalidText = "name: abc x name: def name: ghi name: jkl";
    string validPattern = @"name:\s*([a-z]*)\s*";

    if (!Validate(invalidText))
    {
        try
        {
            throw new Exception("invalid input");
        }
        catch (Exception exception)
        {
            Console.WriteLine($"Input '{invalidText}' produces: {exception.Message}");
        }
    }

    MatchCollection ms = Regex.Matches(validText, validPattern);

    Console.Write($"Input '{validText}' produces: ");
    foreach (Match m in ms)
    {
        Console.Write(m.Groups[1].Value + ", ");
    }
}

public static bool Validate(string input)
{
    var pairs = input.Split(' ');
    return !pairs.Where((item, index) => index % 2 != 0).Any(item => item.EndsWith(":"));
}

// Input 'name: abc x name: def name: ghi name: jkl' produces: invalid input
// Input 'name: abc name: def name: ghi name: jkl' produces: abc, def, ghi, jkl, 

https://regex101.com/r/qsQNr1/1

关于c# - "Tight"重复键/值匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799840/

相关文章:

c# - 什么是 .csdproj 文件?

c# - 无法从代码隐藏中找到控件,但能够找到其他控件

python - 常规模式“^ ab | cd $”和^(ab | cd)$有什么区别?

regex - Powershell-用于限制大写和第一个小写的正则表达式,其后仅是小写和数字

javascript - REGEX 仅匹配有效的 EXCEL 列 (A-XFD)

c# - 如何从 Windows 窗体中的图表中删除网格线?

c# - 有没有一种方法可以根据特定规则自动重新发送 Outlook 2007 和 MS Exchange 的电子邮件?

c# - 克隆一个我无法添加 ICloneable 的对象

正则表达式命令行更改每行的格式

regex - 如何在 bash 中获取变量配置的值?