我有一系列遵循特定格式的分组值,并希望使用单个表达式将它们捕获到组中。例如,我已经-group1 -group2 -group3
并且正在尝试使用类似于(-[\s\S]{1,}?)
This is基本上允许我将整个字符串捕获到一个组中的东西,但我希望能够分别反向引用每个值。我认为这?
会迫使它成为非贪婪的,因此将模式匹配分成三个单独的组(例如)。现在我只是重复引用(-[\s\S]*?)
,但似乎应该有一个更优雅的表达方式。
谢谢!
问问题
4695 次
3 回答
16
你很幸运,因为 C# 是少数支持子表达式捕获的语言之一(如果不是唯一的话)
https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)
.NET API 可以看如下
Matches
Groups (most regex engines stop here)
Captures (unique for .NET)
从你的问题中不清楚你想要完全匹配什么,但这应该让你开始。再次询问您是否被卡住。
string input = "-group1 -group2 ";
string pattern = @"(-\S*\W){2}";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("Match: {0}", match.Value);
for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
{
Group group = match.Groups[groupCtr];
Console.WriteLine(" Group {0}: {1}", groupCtr, group.Value);
for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
Console.WriteLine(" Capture {0}: {1}", captureCtr,
group.Captures[captureCtr].Value);
}
}
这输出
Match: -group1 -group2
Group 0: -group1 -group2
Capture 0: -group1 -group2
Group 1: -group2
Capture 0: -group1
Capture 1: -group2
如您所见, (Group 1, Capture 0) 和 (Group 1, Capture 1) 提供组的单个捕获(而不是大多数语言中的最后一个)
这个地址我认为你描述为“能够分别反向引用每个值”
(您使用术语反向引用,但我认为您的目标不是替换模式吗?)
于 2012-06-15T13:51:14.673 回答
2
使用 .NET 正则表达式(几乎只有 .NET),您可以使用:
(?:(-\S+)\s*)+
组 1 将包含所有匹配子字符串的列表。
或者,Matches
在您的情况下,仅使用就足够了:
var re = new Regex(@"-\S+");
var matches = re.Matches(str);
于 2012-06-15T13:35:58.183 回答
0
试试这个:
(-.+?)(\s|$)
您的第一个捕获组将拥有您想要的(-group1
、-group2
等)。
如果您想更好地控制 之后允许的内容-
,请更改.+?
为,例如,[a-zA-Z0-9]+?
仅匹配字母数字字符。
于 2012-06-15T13:32:07.053 回答