我有以下正则表达式:
@"{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/