2016-07-20 15 views
0

Neu bei der Verwendung von C# Regex, ich versuche, zwei durch Komma getrennte Ganzzahlen aus einer Zeichenfolge in zwei Variablen zu erfassen.Easy Regex Capture

Beispiel: 13,567

Ich habe versucht, Variationen

Regex regex = new Regex(@"(\d+),(\d+)"); 
var matches = regex.Matches("12,345"); 

foreach (var itemMatch in matches) 
    Debug.Print(itemMatch.Value); 

Dies erfasst nur 1 Variable, die die gesamte Zeichenfolge ist. Ich habe Workaround umgangen, indem ich das Aufnahmemuster zu "(\d+)" änderte, aber das mittlere Komma dann völlig ignorierte und ich eine Übereinstimmung erhalten würde, wenn es Text zwischen den ganzen Zahlen gab. Wie bekomme ich es, um beide Ganzzahlen zu extrahieren und sicherzustellen, dass es auch ein Komma dazwischen sieht.

+0

warum nimmst du 'split' nicht? –

+2

In Ihrem Spiel müssen Sie sich 'Gruppen' anschauen. – Chris

+0

Ich denke, ich könnte es, aber da ich Regex nicht benutzt habe, dachte ich, dass dies ein triviales Beispiel ist, um ein bisschen darüber zu lernen. Ich fand es frustrierend frustrierend und musste es noch lösen. So würde eine Lösung mit Regex schätzen. Danke – geoffw123

Antwort

3

Kann dies mit String.Split

Warum nicht nur eine Spaltung verwenden und analysieren?

var results = "123,456".Split(',').Select(int.Parse).ToArray(); 
var left = results[0]; 
var right = results[1]; 

Alternativ können Sie eine Schleife verwenden und int.TryParse verwenden Fehler zu handhaben, aber für das, was Sie suchen sollte es

decken

Wenn Sie wirklich an eine Regex verpflichtet sind

Sie auch mit einem Regex kann dies tun, müssen nur Gruppen des Spiels verwenden

Regex r = new Regex(@"(\d+)\,(\d+)", RegexOptions.Compiled); 
var r1 = r.Match("123,456"); 

//first is total match 
Console.WriteLine(r1.Groups[0].Value); 

//Then first and second groups 

var left = int.Parse(r1.Groups[1].Value); 
var right = int.Parse(r1.Groups[2].Value); 

Console.WriteLine("Left "+ left); 
Console.WriteLine("Right "+right); 

Hergestellt ein dotnetfiddle Sie können in als auch die Lösung testen

+2

Die Frage geht nicht darum, wie man eine Zeichenkette teilt, aber wie man auf Aufnahmegruppen zugreift. Jeder weiß, wie man einen String aufteilt. –

+0

@ WiktorStribiżew Frage war über eine Regex, aber die Lösung war mit einem Split erhältlich, hinzugefügt, wie zu erreichen, was OP suchte mit Regex sowie – konkked

0

Mit Regex, können Sie diese verwenden:

Regex regex = new Regex(@"\d+(?=,)|(?<=,)\d+"); 
var matches = regex.Matches("12,345"); 

foreach (Match itemMatch in matches) 
    Console.WriteLine(itemMatch.Value); 

druckt:

12 
345 

Eigentlich ist dies ein Vorgriffs tun und Look-hinter einem ,:

\d+(?=,)  <---- // Match numbers followed by a , 
|   <---- // OR 
(?<=,)\d+ <---- // Match numbers preceeded by a , 
+1

Der Punkt ist nicht, wie man einen "besseren" Regex schreiben, sondern wie man erfasst Werte. –

+0

Eugh, Riechsalz erforderlich erfreut! Für was ich dachte, war ein einfaches Problem, das ist eine erschreckend aussehende Regex-Vorlage für ein Newb zu verstehen. – geoffw123

+0

@ geoffw123 glaube nicht, dass es hilfreich ist, Kommentare wie diese persönlich zu machen, könnte einfach sagen, dass es über kompliziert aussieht ... dass gesagt zu stimmen, dass dies wie ein suboptimaler Weg aussieht, um das Problem zu behandeln – konkked