如何从正则表达式匹配中获取匹配的子表达式? (C#)

时间:2009-10-15 22:41:22

标签: c# regex

假设我与具有这样的子表达式的模式匹配:

Regex myRegex = new Regex("(man|woman|couple) seeking (man|woman|couple|aardvark)");

string myStraightText = "Type is man seeking woman, age is 44";
MatchCollection myStraightMatches = myRegex.Matches(myStraightText);

string myGayText = "Type is man seeking man, age is 39";
MatchCollection myGayMatches = myRegex.Matches(myGayText);

string myBizarreText = "Type is couple seeking aardvark, age is N/A";
MatchCollection myBizarreMatches = myRegex.Matches(myBizarreText);

在第一场比赛中,我想恢复第一个子表达式匹配“man”(而不是“女人”或“情侣”)和第二个子表达式匹配“女人”(而不是“男人”或“情侣”或“土豚”)。而第二场比赛是“男人”和“男人”等。这个信息是否可以在Match对象的某处获得?

我只知道如何获得完整匹配的字符串。例如,

foreach (Match myMatch in myStraightMatches)
{
    tbOutput.Text += String.Format("{0}\n", myMatch);
}

获得“男人寻求女人”。但我不知道该字符串的哪些部分来自哪个子表达式。

2 个答案:

答案 0 :(得分:5)

试试这个:

myMatch.Groups[0] // "man seeking woman"
myMatch.Groups[1] // "man"
myMatch.Groups[2] // "woman"

编辑:如果你有:

,为了使答案更加完整
new Regex("(?<seeker>man|woman|couple) seeking (?<target>man|woman|couple)");

你可以使用:

myMatch.Groups["seeker"] // "man"
myMatch.Groups["target"] // "woman"

答案 1 :(得分:3)

您可以使用编号组作为Rubens Farias建议。但是,对于程序员的小错误或对正则表达式的后续更改,编号组通常很脆弱。

我通常尝试使用命名组。语法类似于(?<name>...)

然后,您可以像这样引用组:

myMatch.Groups["name"]