2016-08-18 6 views
0

Ich habe einen regulären Ausdruck, die Worte entspricht, bestehend aus Buchstaben, die einen Apostroph gefolgt von einem oder mehreren Buchstaben enthalten:Complement eines regulären Ausdruck

([A-Za-z]+('[A-Za-z]+)?) 

Dies funktioniert gut, aber was ich brauche, ist eigentlich die Komplement (zum Teilen einer Zeichenfolge in Teile, die der obigen Regex entsprechen).

Gibt es eine einfache Möglichkeit, dies zu tun?

+0

Die einfachste Art und Weise auf der Regex zu spalten ist. Das Argument für die Split-Methode ist das Separator-Muster, das genau das ist, was Sie wollen: Was übrig bleibt, sind die Teile, die nicht übereinstimmen. –

+0

Die 'Regex.Split (Eingabe,) ([A-Za-z] + ('[A-Za-z] +)?)") 'Teilt die' Eingabe'-Zeichenfolge bereits in Teile, die nicht mit dieser übereinstimmen Regex. Es gibt keine Notwendigkeit für ein Kompliment. –

+0

Ich glaube, ich habe das falsch verstanden. Ich möchte meinen String in Teile aufteilen, die dem obigen Regex entsprechen. Was bedeutet, dass ich mich auf die Teile aufteilen muss, die nicht mit der obigen Regex übereinstimmen. –

Antwort

1

alle Spiele dieser Regex finden und die angepassten Werte extrahieren:

var input = "a a 123123 123 3 122as'd"; 
var parts = Regex.Matches(input, "[A-Za-z]+('[A-Za-z]+)?") 
    .Cast<Match>().Select(m => m.Value).ToList(); 

// parts: ["a", "a", "as'd"] 
+0

Warum verwenden Sie die Sammlung 'm.Groups', um auf die individuelle Übereinstimmung zuzugreifen? Sie können dasselbe erreichen, indem Sie einfach "m.Value" erhalten. Sehen Sie dieses Arbeitsbeispiel: http://csharppad.com/gist/2a0fa955a9f813e3c9abfab6f579e59e –

+0

Ja, Sie haben Recht. Fixing the post –

+0

Funktioniert gut! Da ich in F # codiere, musste ich diesen Code in 'Regex.Matches (Phrase) ändern, ([A-Za-z] + ('[A-Za-z] +)?)") |> Seq.cast |> Seq.map (Spaß (x: Match) -> x.Value) ', damit es funktioniert. –