2009-06-05 7 views
0

Mon expression régulière a 2 sorties différentes du même code ... mais je ne sais pas ce qui ne va pas. Voici un code, j'espère que vous pourrez m'aider. Merci!Bogue Java? Sortie différente sur 2 regex identiques

String s = "48° 18′ 13,94″ nördliche Breite, " 
     + "11° 34′ 31,98″ östliche Länge"; 

String kommazahl = "[0-9]{1,2}([\\.,][0-9]+)?"; 
String zahl = "[0-9]{1,2}"; 

Pattern p1 = Pattern.compile("("+ zahl +"[°/| ]{1,2}"+ zahl +"(['′/| ]{1,2}("+ kommazahl +")?)?).*" 
          +"("+ zahl +"[°/| ]{1,2}"+ zahl +"(['′/| ]{1,2}("+ kommazahl +")?)?).*"); 

Matcher m1 = p1.matcher(s); 

System.out.println(m1.group(1) + "\n" + m1.group(5)); 

// Output should be: 
// 48° 18′ 13,94 
// 11° 34′ 31,98 

// Output is: 
// 48° 18′ 13,94 
// 1° 34′ 31,98 
+8

Pourquoi tant de gens assument-ils son un bug dans la langue plutôt que de vérifier leur propre code de plus près? –

+0

zahl semble être faux - les degrés peuvent avoir 3 chiffres. Cela n'a rien à voir avec votre problème, ce peut être juste un bug. –

+3

S'il vous plaît prêter attention aux suggestions suggérant lors de l'étiquetage de votre question. Toute balise dont le numéro est inférieur à 10 après son nom est probablement _wrong_. –

Répondre

5

Le .* correspond au premier 1 sur 11 avec gêne, tout en permettant au reste du motif de correspondre. Remplacez .* par quelque chose comme [^0-9]*.

+0

merci, cela fonctionne bien –

4

Le problème est le. * À la fin de la première ligne du motif. C'est avidement correspondre "nördliche Breite, 1".

Peut-être que vous devriez le changer pour capturer ". *," Afin qu'il sache quand s'arrêter?

Pattern p1 = Pattern.compile 
    ("("+ zahl +"[°/| ]{1,2}"+ zahl +"(['′/| ]{1,2}("+ kommazahl +")?)?).*, " 
    +"("+ zahl +"[°/| ]{1,2}"+ zahl +"(['′/| ]{1,2}("+ kommazahl +")?)?).*"); 

Bien sûr, cela ne fonctionnera que s'il y a toujours un « virgule espace » entre les deux valeurs que vous voulez dans le reste de vos données.