假设我与具有这样的子表达式的模式匹配:
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);
}
获得“男人寻求女人”。但我不知道该字符串的哪些部分来自哪个子表达式。
答案 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"]