因此,我得到了以下输入:1,6-10,10000,2,10-11
和下面的regex:^\d+(?:,(\d+|\d+-\d+))*$在.NET Regex中
我希望在逗号之间匹配每个组,但我也希望捕获组以如下方式结束:
Group 1: 1
Group 2: 6-10
Group 3: 10000
Group 4: 2
Group 5: 10-11我尝试过使用非捕获组和其他捕获组的任何组合,但我无法完全找到解决方案。我遗漏了什么?
发布于 2015-06-23 11:58:31
.net正则表达式提供了存储重复捕获组的子字符串的可能性。因此,使用此模式来描述整个字符串:
\A(?:(\d+(?:-\d+)?)(?:,|\z))+\z( \A和\z代表字符串的开始和结束)获取捕获组1中的所有值,只有一个匹配:演示
这种方式确保整个字符串从头到尾都是正确的格式。
代码示例:
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锚点构建一个模式,该模式与上一次匹配后的位置字符串的开始匹配:演示
\G(\d+(?:-\d+)?)(?:(,)|\z)要确保字符串的末尾已经到达,只需检查第二个捕获组是否为最后一次匹配的空。
代码示例:
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]);
}
}显然,如果您已经知道您的字符串格式很好,那么这两种方法都是无用的,只需对逗号进行简单的拆分就可以获得结果。
https://stackoverflow.com/questions/31001909
复制相似问题