假设我有以下正则表达式:
var r = new Regex("Space(?<entry>[0-9]{1,3})");
然后我有字符串:
"Space123"
这是我的程序:
void Main()
{
Regex r = new Regex("Space(?<entry>[0-9]{1,3})", RegexOptions.ExplicitCapture);
foreach (Match m in r.Matches("Space123")){
m.Groups["entry"].Dump(); //Dump() is linqpad to echo the object to console
}
}
我想知道有没有办法得到匹配的正则表达式部分?在这种情况下:
(?<entry>[0-9]{1,3})
我在对象的任何地方都找不到它,但人们会认为它可以访问。
最佳答案
您可以利用 Regex.ToString()
存储正则表达式模式的方法。可以使用 Regex.GetGroupNames()
获得命名的捕获组及其各自的索引和 Regex.GetGroupNumbers()
.
此外,我们需要正则表达式模式内的捕获组数组/列表,这就是为什么我要添加 rxPairedRoundBrackets
正则表达式来捕获未转义圆括号内的所有文本。
我建议使用此代码获取特定命名 组的正则表达式子模式(编辑:现在,甚至可以处理嵌套的未转义括号组!):
var rxPairedRoundBrackets = new Regex(@"(?sx)(?=((?<=[^\\]|^)\(
(?>
(?! (?<!\\)\( | (?<!\\)\) ) .
|
(?<!\\)\( (?<Depth>)
|
(?<!\\)\) (?<-Depth>)
)*
(?(Depth)(?!))
(?<!\\)\)))+");
var r = new Regex(@"(?<OuterSpace>Spa(?<ce>ce))(?<entry>\([0-9]{1,3}\))", RegexOptions.ExplicitCapture);
var bracketedGrps = rxPairedRoundBrackets.Matches(r.ToString()).Cast<Match>().Select(p => p.Groups[1].Value);
var GroupDict = r.GetGroupNames().Zip(r.GetGroupNumbers(), (s, i) => new { s, i })
.ToDictionary(item => item.s, item => item.i);
foreach (Match m in r.Matches("My New Space(123)"))
{
var id = "entry";
var grp = m.Groups[id]; // Just to see the group value
var groupThatMatched = bracketedGrps.ElementAt(GroupDict[id] - 1);
}
这是您案例的代码:
r = new Regex("Space(?<entry>[0-9]{1,3})", RegexOptions.ExplicitCapture);
bracketedGrps = rxPairedRoundBrackets.Matches(r.ToString()).Cast<Match>().Select(p => p.Groups[1].Value);
GroupDict = r.GetGroupNames().Zip(r.GetGroupNumbers(), (s, i) => new { s, i })
.ToDictionary(item => item.s, item => item.i);
foreach (Match m in r.Matches("Space123"))
{
var id = "entry";
var grp = m.Groups[id];
var groupThatMatched = bracketedGrps.ElementAt(GroupDict[id] - 1);
}
输出:
关于c# - 从 .NET 正则表达式对象获取命名组子模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30042013/