2011-07-24 3 views
0

J'essaie d'en apprendre davantage sur les expressions régulières, mais je ne le fais pas aussi bien après avoir lu le didacticiel Java.Expressions régulières: 100 erreurs

Ce programme est censé prendre un imput au format:

a) ajouter dd dd ensemble b) soustraire 05 de 13 c) ajouter 02-03

et retourner le dd (+ ou -) dd = answer

La (mauvaise) façon dont j'ai configuré ceci est d'avoir le prog essayer de trouver l'une des 3 correspondances, et continuer à le faire jusqu'à ce que l'utilisateur entre "bye". S'il n'y a pas de correspondance, il suffit d'inviter à nouveau l'utilisateur pour une entrée.

Voici mon code! Avec exactement 100 erreurs. :/ Si quelqu'un peut m'aider avec la syntaxe, ce serait vraiment apprécié!

import java.util.*; 
    import java.util.regex.Pattern; 
    import java.util.regex.Matcher; 

    class Calculator { 
     public static void main(String[] args){ 
     Scanner imp = new Scanner(System.in); 
     System.out.println("yes> "); 
     String s = imp.nextLine(); 

     if (s.equals("bye")) { 
      System.exit(0); 
     } 

     while (true) { 

      Pattern p = Pattern.compile(s); //compile string, check for formats 

      Matcher x = p.matcher(\badd\b\s\d\d\s\d\d\s\btogether\b); //format add 12 12 together 
      Matcher y = p.matcher(\bsubtract\b\s\d\d\s\d\d\s\bfrom\b); //format subtract 05 from 13 
      Matcjer z = p.matcher(\badd\b\s\d\d\s\bto\b\s\d\d); //format add 02 to 03 

      boolean b = p.matches; 

      boolean l = x.matches; 
      boolean i = y.matches; 
      boolean g = z.matches; 

      if (l.equals(true)) 
      return (\d\d " + " \d\d " = " \d\d+\d\d); 
      else if (i.equals(true)) 
      return (\d\d " + " \d\d " = " \d\d-\d\d); 
      else if (g.equals(true)) 
      return (\d\d " + " \d\d " = " \d\d+\d\d); 
     } 
     } 
    } 
+5

Le compilateur cesse d'émettre des erreurs après 100. Il peut y avoir plus :) –

+0

LOL. bonne nouvelle cameron. – mdegges

+2

Les bonnes nouvelles sont qu'une erreur peut générer de nombreuses erreurs de compilation, donc vous avez probablement moins de 100 * véritables * erreurs :) –

Répondre

3

ugh où commencer ...

Tout d'abord Pattern.compile() attend le regex (les chaînes de format), tandis que la chaîne matcher() attend pour tester contre

@Samir vous a montré ce qui était mal avec les regexes dans le code lui-même (je les ai édité un peu pour plus de clarté)

l.matches a besoin ()

vous ne pouvez pas appeler des méthodes sur variabl booléenne primitive es if(b) est suffisante pour vérifier s'il est vrai ou non

et d'obtenir sous-correspondances spécifiques que vous devez utiliser capturing groups

pour concaténer des chaînes de caractères que vous pouvez utiliser +

à quelque chose de sortie au système de la console. out.println doit être utilisé non retour

avec les erreurs les plus évidentes résolus:

import java.util.*; 
import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

class Calculator { 
    public static void main(String[] args){ 
    Scanner imp = new Scanner(System.in); 
    System.out.println("yes> "); 


    while (true) { 
     String s = imp.nextLine();//put getting the input inside the loop or it's infinite 

     if (s.equals("bye")) { 
      System.exit(0); 
     } 

     Matcher x = Pattern.compile("add\\s(\\d+)\\s(\\d+)\\stogether").matcher(s); //format add 12 12 together 
     Matcher y = Pattern.compile("subtract\\s(\\d+)\\sfrom\\s(\\d+)").matcher(s); //format subtract 05 from 13 
     Matcjer z = Pattern.compile("add\\s(\\d+)\\sto\\s(\\d+)").matcher(s); //format add 02 to 03 


     boolean l = x.matches(); 
     boolean i = y.matches(); 
     boolean g = z.matches(); 

     if (l){ 
     System.out.println(l.group(1) + " + " + l.group(2) + " = " + 
      (Integer.parseInt(l.group(1))+Integer.parseInt(l.group(2)))); 
     }else if (i){ 
     System.out.println(i.group(1) + " - " + i.group(2) + " = " + 
      (Integer.parseInt(i.group(1))+Integer.parseInt(i.group(2)))); 
     }else if (g){ 
     System.out.println(g.group(1) + " + " + g.group(2) + " = " + 
      (Integer.parseInt(g.group(1))+Integer.parseInt(g.group(2)))); 
     } 
    } 
    } 
} 
+0

Merci d'avoir montré comment implémenter le regroupement et l'utiliser pour analyser la chaîne. Très très utile – mdegges

+0

juste une petite modification qui m'a pris un certain temps à comprendre: 1. cette façon fonctionne si vous voulez seulement que l'utilisateur entre des chiffres au format dd +/- dd. pour le modifier afin que n'importe quel nombre de chiffres puisse être entré, le format doit changer en ("ajouter \\ s (. *) \\ tout à fait") & puis une deuxième regex est nécessaire pour rechercher seulement les chiffres. 2. lors de l'impression, il doit être matcherVariable.group (nombre). – mdegges

+0

@michele vous pouvez également utiliser '(\ d +)' si vous voulez 1 ou plusieurs chiffres vérifier les nouvelles regexes dans le code –

5

Avez-vous essayé de regarder votre code dans un IDE tel que Eclipse ou IntelliJ IDEA? Ils vont mettre en évidence les erreurs pour vous. Le principal que je vois est que vous ne mettez pas les expressions régulières dans les chaînes. Java n'a pas d'expressions rationnelles natives, vous devrez donc les fournir sous forme de chaînes. Voici un exemple:

Matcher x = p.matcher("\\badd\\b\\s\\d\\d\\s\\d\\d\\s\\btogether\\b"); //format add 12 12 together 

Remarquez comment j'ai doublé les antislashs. C'est parce que c'est le caractère d'échappement dans Java ainsi que dans les expressions rationnelles. Le compilateur interprétera la chaîne ci-dessus comme \badd\b\s\d\d\s\d\d\s\btogether\b, puis l'analyseur d'expression régulière interprétera correctement les caractères d'échappement.

+0

Merci! Je n'ai pas réalisé que j'avais besoin de citations ou d'un autre ensemble de \ 's. – mdegges

+0

J'utilise principalement le dr java et la ligne cmd. Mais parfois je vais avoir une erreur (maintenant je reçois "ne trouve pas les correspondances de symboles") et je ne sais pas comment y remédier.Je viens d'éditer du code depuis le tutoriel et 'x.matches' fonctionnait bien dans leur programme regex. – mdegges