【发布时间】:2018-11-28 23:56:11
【问题描述】:
我有以下正则表达式:
@"{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 配置(这是从我想要将所有内容分开时开始的),但到目前为止我还没有找到能够产生我想要的组合.有人可以阐明正确的正则表达式/连接组合以产生上述预期结果吗?
【问题讨论】:
-
听起来好像你只想要
Regex.Matches(s, @"{thing:([^}]*)}").Cast<Match>().Select(x => x.Groups[1].Value).ToList()(regex demo) -
@WiktorStribiżew 这很有效,非常感谢。您想将您的评论作为答案发布,以便我接受它作为答案吗?再次感谢。
-
(?<={thing:).*?(?=})怎么样,这不是更好的答案吗?我应该发布它并且您可以接受吗?或者,你是不是有点疯狂地使用特定于重复字母的正则表达式?!?!?
标签: c# regex match regex-group