2016-05-27 12 views
0

Ich habe einige Probleme beim Versuch, eine Regex für meinen Code zu finden. Hier ist es:Ich brauche eine Regex, die Zahlen in Abhängigkeit von einer Variablen

Scanner key = new Scanner(System.in); 

    //this is the variable 
    int s = 4; 

    String input = ""; 
    String bregex = "[1-9][0-9]{1," + (s*s) + "}"; 
    boolean cfgmatch = false; 

    while(cfgmatch == false){ 

     input = key.next(); 

     Pattern cfgbp = Pattern.compile(bregex); 

     Matcher bm = cfgbp.matcher(input); 

     if(bm.matches()){ 

      System.out.println("working"); 

     } 
     else{ 

      System.out.println("not working"); 

     } 

    } 

Ich versuche, eine Regex zu machen, um eine Reihe von Zellen in einer Platine zu resrict. Die Anzahl der Zellen kann nicht höher sein als der Platz auf dem Board, der "s * s" ist.

Beispiel: Wenn Boards Größe 4 ist, kann der Eingang von 1 bis 16 Jahre alt sein, wenn sie 5 ist, von 1 bis 25, etc ...

Brettgröße nur von 1 bis 9 sein kann

Ich habe geschrieben, während, um eine andere Nummer zu fragen, falls die Eingabe fehlschlägt.

+2

Warum Sie einen String-Tool, regex verwenden, für das, was klingt wie am besten durch eine einfache nu gehandhabt wird Meric boolescher Check? Es sieht so aus, als ob du mit einem Schraubenzieher Holzbretter durchschneiden willst - dass du das falsche Werkzeug für den Job verwendest. –

+1

Ich denke, [Zawinski] (https://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/) meinte Situationen wie diese, als er schrieb: "Einige Leute, wenn sie mit einem Problem konfrontiert werden, Denken Sie "Ich weiß, ich werde reguläre Ausdrücke verwenden." Jetzt haben sie zwei Probleme. " –

Antwort

1

Seien Sie vorsichtig mit regulären Ausdrücken

Während ein regulärer Ausdruck möglicherweise für diese funktionieren könnte, ist es wirklich besser gestaltet Musteranpassung zu handhaben, im Gegensatz zu Operationen Arithmetik. Ihr aktueller regulärer Ausdruck würde s*s Ziffern erzeugen, die gehen nicht den Bereich, den Sie zu definieren suchen:

// If s = 4, then this regular express will match any string that begins with a 1 and 
// would allow any values from 1-99999999999999999 as opposed to the 1-16 you are expecting 
String bregex = "[1-9][0-9]{1,16}"; 

Betrachten sie einen einfacheren Ansatz

Sie können es, wenn Sie besser dran zu vermeiden numerisch auf einem anderen Wert gehen, um Ihre Eingabe zu vergleichen (dh ist diese Zahl kleiner als x):

// Is your number less than the largest possible square value? 
if(parseInt(input) <= s*s){ 
    // Valid 
} 
else { 
    // Invalid 
} 
+0

Keine Notwendigkeit für die "ParseInt", da 'Scanner' eine' nextInt() 'Methode hat. – Sam

+0

Das ist wahr Sam. Ich habe nur ein sehr generisches Beispiel angegeben (d. H. "Eingabe" in diesem Szenario könnte eine beliebige Zeichenfolge sein). –

+0

Danke, du hast mir wirklich geholfen. Eine Bedingung ist einfacher, dass ein Getrappel es wahr ist .. diese Dinge passieren, wenn Sie stundenlang schreiben, haha –