我有一系列符合特定格式的分组值,并希望使用单个表达式将它们捕获到组中。
例如,我有-group1 -group2 -group3
并试图使用与(-[\s\S]{1,}?)
类似的东西这基本上允许我将整个字符串捕获到一个组中但我希望能够反向引用每个字符串价值分开。我认为?
会强制它非贪婪,因此,将模式匹配分成三个独立的组(例如)。
现在我只是重复引用(-[\s\S]*?)
,但似乎应该有一个更优雅的表达
谢谢!
答案 0 :(得分:14)
你很幸运,因为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
如您所见(第1组,捕获0)和(第1组,捕获1)提供组的单独捕获(而不是大多数语言中的最后一次)
这个地址我想到你所描述的“能够分别反向引用每个值”
(你使用术语反引用,但我不认为你的目标是替换模式吗?)
答案 1 :(得分:2)
使用.NET正则表达式(几乎只有.NET),您可以使用:
(?:(-\S+)\s*)+
第1组将包含所有匹配的子串的列表。
或者只是在您的情况下使用Matches
就足够了:
var re = new Regex(@"-\S+");
var matches = re.Matches(str);
答案 2 :(得分:0)
试试这个:
(-.+?)(\s|$)
您的第一个捕获组将拥有您想要的内容(-group1
,-group2
等。
如果您希望在-
之后更好地控制允许的内容,请将.+?
更改为例如[a-zA-Z0-9]+?
以仅匹配字母数字字符。