2012-05-31 19 views
7

Ich habe eine Zeichenfolge mit zwei oder mehr Zahlen. Hier sind ein paar Beispiele:Verwenden von Regex, um mehrere Zahlen aus Strings zu extrahieren

"(1920x1080)" 
" 1920 by 1080" 
"16 : 9" 

Wie kann ich extrahiere separate Zahlen wie „1920“ und „1080“ von ihm, vorausgesetzt, sie werden nur durch ein oder mehrere nicht-numerische Zeichen (n) getrennt werden?

+0

Bitte entscheiden Sie, in welcher Sprache Sie die Antwort benötigen. Die Regex-Objekte in .NET sind nicht die gleichen wie die Java-Objekte. – Oded

+0

@Oded ok, fertig. – David

Antwort

9

Der Grund würde reguläre Ausdruck sein:

[0-9]+ 

Sie die Bibliothek verwenden müssen, um alle Spiele zu gehen und ihre Werte zu bekommen.

var matches = Regex.Matches(myString, "[0-9]+"); 

foreach(var march in matches) 
{ 
    // match.Value will contain one of the matches 
} 
1
(\d+)\D+(\d+) 

Danach, fertigen Sie diese Regex den Geschmack der Sprache entsprechen, die Sie verwenden werden.

+0

'\ d' enthält _alle_ Ziffern, nicht nur römische Ziffern, abhängig von Regex-Bibliothek und -Plattform. – Oded

+0

.net/C# (und PCRE) Regex '\ d' entspricht [0-9]. Zeitraum. – dda

+0

Nein, tut es nicht. Es wird aufübereinstimmen - http://Stackoverflow.com/a/6479605/1583 – Oded

1

können Sie

string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"}; 
foreach (var item in input) 
{ 
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray(); 
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]); 
} 

OUTPUT verwenden:

1920,1080 
1920,1080 
16,9 
+0

gut, aber oft gibt extra leere Zeichenfolgen zurück. – David

+0

Ja, aktualisiert, Danke @David – Damith

5

Sie die Zeichenfolge durch folgende erhalten können

MatchCollection v = Regex.Matches(input, "[0-9]+"); 
foreach (Match s in v) 
      { 
       // output is s.Value 
      } 
+0

'RegexOptions.IgnoreCase' wird nicht benötigt. Römische Ziffern haben keine Groß-/Kleinschreibung. – Oded

+0

Normalerweise übe ich mit RegexOptions.IgnoreCase. Entschuldigung für Fehler –

+0

Kein Fehler als solcher. Wird in diesem Fall nicht benötigt. – Oded

0

Es gibt immer noch, obwohl ein Problem ist, alle oben genannten Antworten Betrachten Sie 12i oder a2 gültige Zahlen, wenn sie sh nicht.

Die folgende könnte dieses Problem lösen

var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)"); 

Aber diese Lösung fügt eine weitere Ausgabe :) Das wird die Räume rund um die ganze Zahl erfassen. Um dies zu lösen, müssen wir den Wert der ganzen Zahl in einer Gruppe erfassen:

MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)"); 
HashSet<string> uniqueNumbers = new HashSet<string>(); 
foreach (Match m in matches) 
{ 
    uniqueNumbers.Add(m.Groups[1].Value); 
} 
Verwandte Themen