Frage an c#, .net, regex – Verwenden von Regex zum Extrahieren mehrerer Zahlen aus Zeichenfolgen

7

Ich habe eine Zeichenfolge mit zwei oder mehr Zahlen. Hier einige Beispiele:

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

Wie kann ich extrahierentrennen Zahlen wie "1920" und "1080", vorausgesetzt, sie werden nur durch ein oder mehrere nicht numerische Zeichen getrennt?

@Oded ok, fertig. David
Bitte entscheiden Sie, in welcher Sprache Sie die Antwort benötigen. Die Regex-Objekte in .NET stimmen nicht mit den Java-Objekten überein. Oded

Deine Antwort

5   die antwort
1

Sie können verwenden

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]);
}

AUSGABE:

1920,1080
1920,1080
16,9
gut, gibt aber oft zusätzliche leere Zeichenketten zurück. David
Ja, aktualisiert, danke @David Damith
1
(\d+)\D+(\d+)

Passen Sie anschließend diesen regulären Ausdruck an die jeweilige Sprache an.

Wenn das Zeichen als Unicode-Ziffer definiert ist, wird es in .NET von abgeglichen\d. Oded
@Rawling - Ja, das sind sie. Schlecht gesagt von mir. Bedeutet die Ziffern, die normalerweise im Westen verwendet werden, im Vergleich zu anderen Skripten. Oded
@Oded Dein erster Kommentar hat mich verwirrt, bis mir klar wurde, dass du das nicht meintestI, II, ...VII usw. Sind nicht 0-9 Arabisch? Rawling
Nein, das tut es nicht. Es wird am ٠١٢٣٤٥٦٧٨٩ übereinstimmen -stackoverflow.com/a/6479605/1583 Oded
10

Der reguläre Grundausdruck wäre:

[0-9]+

Sie müssen die Bibliothek verwenden, um alle Übereinstimmungen zu überprüfen und ihre Werte abzurufen.

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

foreach(var march in matches)
{
   // match.Value will contain one of the matches
}
0

Es gibt jedoch immer noch ein Problem. Alle obigen Antworten berücksichtigen 12i oder a2 gültige Zahlen, wenn dies nicht der Fall sein sollte.

Folgendes könnte dieses Problem lösen

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

Diese Lösung fügt jedoch noch ein weiteres Problem hinzu :) Dadurch werden die Leerzeichen um die Ganzzahl erfasst. 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);
}
5

Sie können die Zeichenfolge folgendermaßen abrufen

MatchCollection v = Regex.Matches(input, "[0-9]+");
foreach (Match s in v)
            {
                // output is s.Value
            }
Normalerweise übe ich mit RegexOptions.IgnoreCase. Entschuldigung für den Fehler Md Kamruzzaman Sarker
RegexOptions.IgnoreCase wird nicht gebraucht. Römische Ziffern haben keine Groß- / Kleinschreibung. Oded
Kein Fehler an sich. Nur in diesem Fall nicht benötigt. Oded

Verwandte Fragen