使用正则表达式验证输入是否仅匹配

Use regex to validate that input is only matches

我想验证一串文本:.Foo().Bar(20).Baz(Hello) 可以是以下模式的任意多次重复:

\.(?<exName>[A-Z,a-z]+)\((?<exVal>[^)]+)?\)

这正确地提供了三个匹配项:("Foo",empty), ("Bar","20"), 和 ("Baz", "你好").

不幸的是,以下测试字符串提供了三个匹配项;但在我的要求的上下文中,由于额外的东西,字符串无效:

.Foo().Bar(20)k.Baz(Hello)hgjfvg

我如何解决此问题以正确 return 三个匹配项,同时包括给定字符串必须由一个或多个匹配项组成且没有无关文本的要求?

您可以重复整个模式并附加锚点,然后在 C# 中获取 Group.Captures 属性 的值以获取命名组的值。

^(?:\.(?<exName>[A-Za-z]+)\((?<exVal>[^()]*)\))+$

看到一个regex demo | C# demo

例如压缩两个组集合和匹配单行:

string pattern = @"\A(?:\.(?<exName>[A-Za-z]+)\((?<exVal>[^()]*)\))+\z";
        
var strings = new List<string>() {
    ".Foo().Bar(20).Baz(Hello)",
    ".Foo().Bar(30)k.Baz(Hi)hgjfvg",
    ".Foo(test).Bar(40).Baz(Bye)"
    };
foreach (var input in strings)
{
    foreach (Match m in Regex.Matches(input, pattern))
    {
        m.Groups["exName"]
        .Captures.Select(c => c.Value)
        .Zip(
            m.Groups["exVal"].Captures.Select(c => c.Value),
            (exName, exVal) => exName + " -> " + exVal
        ).ToList()
        .ForEach(s => Console.WriteLine(s));
        Console.WriteLine("---------------");
    }
}

输出

Foo -> 
Bar -> 20
Baz -> Hello
------------------------------
Foo -> test
Bar -> 40
Baz -> Bye
------------------------------