myRegex.GetGroupNames()
Scheint auch die nummerierten Gruppen zurückzugeben... wie bekomme ich nur die benannten?
Eine Lösung unter Verwendung des tatsächlichen Match-Objekts wäre auch in Ordnung.
myRegex.GetGroupNames()
Scheint auch die nummerierten Gruppen zurückzugeben... wie bekomme ich nur die benannten?
Eine Lösung unter Verwendung des tatsächlichen Match-Objekts wäre auch in Ordnung.
Verwendet die RegexOptions.ExplicitCapture
-Option beim Erstellen des Regex das, was Sie möchten? z.B.
Regex theRegex = new Regex(@"\b(?\w+)\b", RegexOptions.ExplicitCapture);
Von MSDN:
Gibt an, dass nur explizit benannte oder nummerierte Erfassungen gültig sind Gruppen der Form
(?...)
. Dies ermöglicht es unbenannten Klammern, als nicht erfassende Gruppen zu fungieren, ohne die syntaktische Umständlichkeit des Ausdrucks(?:...)
.
Sie brauchen sich also keine Sorgen darüber machen, ob Benutzer Ihrer API nicht erfassende Gruppen verwenden, wenn diese Option eingestellt ist.
Siehe die anderen Kommentare/Antworten zur Verwendung von (?:)
und/oder zum Festhalten an "einem Stil". Hier ist mein bester Ansatz, der versucht, die Frage direkt zu lösen:
var named = regex.GetGroupNames().Where(x => !Regex.IsMatch(x, "^\\d+$"));
Dies wird jedoch für reguläre Ausdrücke wie (?<42>...)
scheitern.
Viel Spaß beim Codieren.
public string[] GetGroupNames(Regex re)
{
var groupNames = re.GetGroupNames();
var groupNumbers = re.GetGroupNumbers();
Contract.Assert(groupNames.Length == groupNumbers.Length);
return Enumerable.Range(0, groupNames.Length)
.Where(i => groupNames[i] != groupNumbers[i].ToString())
.Select(i => groupNames[i])
.ToArray();
}
Eigentlich wird dies immer noch fehlschlagen, wenn der Gruppenname und die Nummer zufällig gleich sind : Aber es wird erfolgreich sein, auch wenn der Gruppenname eine Nummer ist, solange die Nummer nicht mit dem Index übereinstimmt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.