我们说我有以下正则表达式:
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})
我无法在对象的任何地方找到它,但人们会认为它可以访问。
答案 0 :(得分:5)
您可以利用存储正则表达式模式的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);
}
输出: