2017-01-13 6 views
0

ich folgendes Problem haben:Regex Ausdruck für Anpassungsbereiche

  • Ein String ist über Regex-Ausdruck validiert werden.
  • Die Zeichenfolge enthält Bereiche oder einzelne Werte, die durch ein Semikolon getrennt sind, z. 100-200;10;2300-3400;34;
  • Der Höchstwert jeder Nummer ist 99999.
  • In der Zeichenfolge sind keine Buchstaben zulässig.

Was ich bisher:

^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$? 

So meine regex besteht aus drei optionale Gruppe-Typen:

  • Beginn: ^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])?
  • Mitte: ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])?
  • End : ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$?

Diese Regex löst mein Problem zwar nicht, da zum Beispiel Buchstaben innerhalb des Eingabeausdrucks oft true zurückgeben, aber false zurückgeben sollten. Irgendeine Idee, wie man das löst?

Dies ist eine vereinfachte Version der Regex nach dem Kommentar von RB:

  • Beginn: ^(\d{1,5}\-\d{1,5};)? ^(\d{1,5};)?
  • Mitte: (\d{1,5}\-\d{1,5};)? (\d{1,5};)?
  • Ende: (\d{1,5}\-\d{1,5};)*$? (\d{1,5};)*$?
+0

Wie wäre es mit negativen '-10-10' Bereichen und absteigenden Bereichen' 200-100'? – fubo

+0

Negative Bereiche sind nicht erlaubt, absteigende sind – Chris

+2

Warum nicht einfach String Split zuerst durch Semikolon und dann durch Bindestrich geteilt. Schließlich verwenden Sie int.TryParse. – jdweng

Antwort

1

Wie dies zu extrahieren die Gruppen:

\b(?<FirstNum>[1-9][0-9]{1,4})(-(?<SecondNum>[1-9][0-9]{1,4}))?; 

Permalink to RegexStorm einschließlich zwei ungültiger Testfälle 1234- und 12345678912345.

dann zu überprüfen, ob es irgendwelche Buchstaben einfach den unten Ausdruck verwenden enthält:

[A-Za-z] 

und bestätigen Sie mit:

Regex regex = new Regex("[A-Za-z]"); 
if (regex.IsMatch(inputString)) 
{ 
    //Invalid string 
} 

Obwohl ein regulärer Ausdruck für diese Option, wenn Sie nützlich ist eigentlich Wenn Sie die Bereiche später verwenden möchten, verwenden Sie am besten eine Kombination aus string.Split und int.TryParse:

string input = "100-200;10;2300-3400;34;"; 

string[] ranges = input.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); 
foreach (string range in ranges) 
{ 
    string[] numbers = range.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries); 
    foreach (string number in numbers) 
    { 
     int parsedNumber; 
     if (!Int32.TryParse(number, out parsedNumber)) 
     { 
      //Invalid input 
      break; //Or return false... 
     } 

     //Use parsedNumber here 
    } 
} 
+0

Der Regex erlaubt Eingaben wie '1234-' und '1234512345'. Es erlaubt auch führende (oder alle) Nullen, obwohl die ursprüngliche auch, also nur darauf hinweist, dass – pinkfloydx33

+0

@ pinkfloydx33 Gute Fänge Ich habe aktualisiert, so dass es jetzt funktionieren sollte – TheLethalCoder

+1

@ pinkfloydx33 Ich habe jetzt einen Permalink jetzt zum Testen jetzt und ein anderes Problem behoben, so dass es zu Beginn des Spiels nach einer Wortgrenze sucht – TheLethalCoder