c# - 在 C# 中使用 .matches .Concat 进行正则表达式和正确捕获

标签 c# regex match regex-group

我有以下正则表达式:

@"{thing:(?:((\w)\2*)([^}]*?))+}"

我用它来查找字符串中的匹配项:

MatchCollection matches = regex.Matches(string);
       IEnumerable formatTokens = matches[0].Groups[3].Captures
                                   .OfType<Capture>()
                                   .Where(i => i.Length > 0)
                                   .Select(i => i.Value)
                                   .Concat(matches[0].Groups[1].Captures.OfType<Capture>().Select(i => i.Value));

这曾经产生我想要的结果;但是,此后我的目标发生了变化。这是现在所需的行为:

假设输入的字符串是'stuff/{thing:aa/bb/cccc}{thing:cccc}'

希望 formatTokens 是:

formatTokens[0] == "aa/bb/cccc"
formatTokens[1] == "cccc"

现在,这就是我得到的:

formatTokens[0] == "/"
formatTokens[1] == "/"
formatTokens[2] == "cccc"
formatTokens[3] == "bb"
formatTokens[4] == "aa"

请特别注意,即使输入了两次,“cccc”也不会出现两次。

我认为问题是 1) 正则表达式中的重新捕获和 2) concat 配置(这是我希望将所有内容分开时的配置),但到目前为止我还没有找到能够产生我想要的结果的组合.有人可以阐明正确的正则表达式/concat 组合以产生上述预期结果吗?

最佳答案

你可以使用

Regex.Matches(s, @"{thing:([^}]*)}")
    .Cast<Match>()
    .Select(x => x.Groups[1].Value)
    .ToList()

参见 regex demo

详情

  • {thing: - 文字 {thing: 子串
  • ([^}]*) - 捕获第 1 组(当获得匹配项时,可以通过 match.Groups[1].Value 访问其值): 0+ 个字符,}
  • 除外
  • } - } 字符。

通过这种方式,您可以找到多个匹配项并仅收集结果列表/数组中的第 1 组值。

关于c# - 在 C# 中使用 .matches .Concat 进行正则表达式和正确捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50938228/

相关文章:

c# - UDP 客户端 - 创建套接字时出现异常通常只允许每个套接字地址(协议(protocol)/网络地址/端口)使用一次

c# - 如何在给定 RowID 和要更新的值的情况下更新表行。 MVC C# 林克

c# - 使用MSMQ的并行Foreach

regex - 如何使用 Bash 删除 csv 文件中的相同列

for-loop - “where”方法在 'onChange'方法中不起作用

c# - 删除时间部分并以不同格式转换日期时间

javascript - 在javascript中用多个分隔符分割字符串并保留它们

php - 字符串清理以支持特殊字符,例如 ñ、á、é、í、ó、ú 等

Javascript 正则表达式匹配出现空值

hashmap - 使用 Rust HashMap - .find() 没有返回匹配的预期值