2016-03-22 2 views
1

Ich möchte alle drei Zahlen durch Komma abgegrenzt und kann beginnen und enden mit Klammern.Split drei Integer aus Text mit Regex C#

Valid Beispiele sind: {30,40,50}, [30,40,50], (30,40,50) bzw. 30,40,50

möglich, auch 30, 40,50 (Mittel können Leerzeichen nach Kommata sein, bevor einer der drei Zahlen)

Nicht gültig Beispiele sind: {30,40,50 oder {30,40,50]

und ich möchte nach dem spalten nur die Integres.

Ich habe versucht:

Regex regex = new Regex(@"({|(|[)?\d+,\d+,\d+({|(|[)?"); 
Match match = regex.Match(laticeDim.Text); 
if (match.Success) 
{ 
    int[] integers = laticeDim.Text.Trim('{', '}', '[', ']', '(', ')').Split(',') 
     .Select(s => Convert.ToInt32(s)) 
     .ToArray(); 

} 

Aber ich habe Zeitfehler auf der ersten Codezeile oben laufen.

Irgendwelche Vorschläge? Was ist der beste Weg, um einen solchen Ausdruck zu finden?

+0

Try [ '{( \ d + (:, \ d +) {2}?)} | \ [? ( \ d + (?:? \ D +) {2})] | \ (( \ d + (?:, \ d +) {2}) \) | (? \ d + (?:, \ d +) {2}) \ b (?! [ ])}]) '] (http: //regexstorm.net/tester? p =% 7b \ (% 3f% 3cval% 3e% 5cd% 2b \ (% 3f% 3a% 2c% 5cd% 2b \)% 7b2 % 7d%)% 7d% 7c% 5c% 5b% (% 3f% 3cval% 3e% 5cd% 2b \ (% 3f% 3a% 2c% 5cd% 2b \)% 7b2% 7d%)% 5d% 7c% 5c \ (\ (% 3f% 3cval% 3e% 5cd% 2b \ (% 3f% 3a% 2c% 5cd% 2b \)% 7b2% 7d \)% 5c \)% 7c \ (% 3f% 3c!% 5b% 5b \ (% 7b% 5d \)% 5cb \ (% 3f% 3cval% 3e% 5cd% 2b \ (% 3f% 3a% 2c% 5cd% 2b \)% 7b2% 7d \)% 5cb (% 3f!% 5b% 5d \)% 7d% 5d \) & i = +% 7b30% 2c40% 2c50% 7d +% 5b30% 2c40% 2c50% 5d + \ (30% 2c40% 2c50 \) ++ 30% 2c40% 2c50 % 0d% 0a% 7b30% 2c40% 2c50 + oder +% 7b30% 2c40% 2c50% 5d) .Verwenden 'match.Groups [" val "]. Wert' –

Antwort

1

Erklärung des Fehlers

Sie haben einen Fehler erhalten, weil Sie die Sonderzeichen ( und [ zu entkommen vergessen. Beachten Sie, dass Sie auch Ihre Regex auf der Suche nach Eröffnungen geschweiften Klammern (für die Einfachheit werde ich sie alle anrufen braces) am Ende Ihrer Regex (in meiner Antwort behoben).

Regex Lösung

Diese Regex sollte besser sein: ({|\(|\[)?\s*\d+,\s*\d+,\s*\d+\s*(}|\)|\])?

Es geht um so komplex wie dein ist (so sollten Sie es verstehen). Es ist auch nur etwas länger.

Hier ist, wie es funktioniert:

#Is there an opening brace? 
(
    {|\(|\[ 
)? 

#Find the numbers, even with spaces. 
    #Note: currently, does not allow spaces between # and comma 
\s* 
\d+,\s* 
\d+,\s* 
\d+\s* 

#Is there a closing brace? 
(
    }|\)|\] 
)? 

Änderungen an Ihrem C#

Meine regex Ihre erwünschte und unerwünschte Strings erfassen beide, und es wird auch Ihren aktuellen Code brechen (ich glaube, aber ich don Ich kenne C# nicht. Glücklicherweise sollte es einfach sein, all diese Probleme zu beheben.

Sie können .Replace("regex", "") mit diesem Regexes verwenden: [{}], [\[\]], [)(] die Klammern zu entfernen. Wenn Sie dies in einer Schleife (3 Iterationen, eine pro Regex) tun, können Sie die ursprüngliche Länge mit der Länge der neuen Zeichenfolge vergleichen. Wenn der Unterschied in der Länge 1 ist, hast du ein schlechtes Match gefunden und du gehst sofort zum nächsten Match. Nach einer Übereinstimmung alle drei Iterationen, .Split es über die Kommas, .Trim die Leerzeichen, und schließlich, fügen Sie die Zahlen zu Ihrem Array.

-1

Versuchen Sie dieses

[{|(|[)?\d+,\d+,\d+(}|)|]]? 
+2

Können Sie erklären, warum/wie diese Regex die Frage beantwortet? Es wird für andere hilfreicher sein, wenn klar ist, worin der Unterschied besteht. – Nanhydrin