首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在非捕获组内递归捕获组?

在非捕获组内递归捕获组?
EN

Stack Overflow用户
提问于 2015-06-23 11:45:07
回答 1查看 372关注 0票数 2

因此,我得到了以下输入:1,6-10,10000,2,10-11

和下面的regex:^\d+(?:,(\d+|\d+-\d+))*$在.NET Regex中

我希望在逗号之间匹配每个组,但我也希望捕获组以如下方式结束:

代码语言:javascript
运行
复制
Group 1: 1
Group 2: 6-10
Group 3: 10000
Group 4: 2
Group 5: 10-11

我尝试过使用非捕获组和其他捕获组的任何组合,但我无法完全找到解决方案。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-23 11:58:31

.net正则表达式提供了存储重复捕获组的子字符串的可能性。因此,使用此模式来描述整个字符串:

代码语言:javascript
运行
复制
\A(?:(\d+(?:-\d+)?)(?:,|\z))+\z

( \A\z代表字符串的开始和结束)获取捕获组1中的所有值,只有一个匹配:演示

这种方式确保整个字符串从头到尾都是正确的格式。

代码示例:

代码语言:javascript
运行
复制
string input = "1,6-10,10000,2,10-11";
string pattern = @"\A(?:(\d+(?:-\d+)?)(?:,|\z))+\z";
Match match = Regex.Match(input, pattern);
if (match.Success) {
    Console.WriteLine("Matched text: {0}", match.Value);
    for (int ctr = 1; ctr < match.Groups.Count; ctr++) {
        Console.WriteLine(" Group {0}:  {1}", ctr, match.Groups[ctr].Value);
        int captureCtr = 0;
        foreach (Capture capture in match.Groups[ctr].Captures) {
             Console.WriteLine("   Capture {0}: {1}", captureCtr, capture.Value);
             captureCtr++; 
        }
    }
}

另一种方法是使用全局研究(几次连续的匹配),并确保所有结果都是连续的。要做到这一点,您需要使用\G锚点构建一个模式,该模式与上一次匹配后的位置字符串的开始匹配:演示

代码语言:javascript
运行
复制
\G(\d+(?:-\d+)?)(?:(,)|\z)

要确保字符串的末尾已经到达,只需检查第二个捕获组是否为最后一次匹配的空。

代码示例:

代码语言:javascript
运行
复制
string input = "1,6-10,10000,2,10-11";

string pattern = @"\G(\d+(?:-\d+)?)(?:(,)|\z)";

MatchCollection results = Regex.Matches(input, pattern);

if (results.Count == 0) {
    Console.WriteLine("No results");
} else if ( results[results.Count - 1].Groups[2].Length > 0 ) {
    Console.WriteLine("Bad format");
} else {
    foreach (Match match in results) {
        Console.WriteLine(match.Groups[1]);
    }
}

显然,如果您已经知道您的字符串格式很好,那么这两种方法都是无用的,只需对逗号进行简单的拆分就可以获得结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31001909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档