2017-10-18 42 views
1

J'utilise l'expression rationnelle suivante: "(? ([0-9] +) -?) +".Mon regex ne correspond pas à une certaine entrée - java

J'essaie de voir s'il y a un caractère négatif entre deux nombres. L'expression rationnelle devrait permettre les moins avant les nombres mais pas entre eux.

Je le teste avec l'entrée de ligne de commande suivante: "4 6 8 2 5-3 4 3 9", le programme retourne ce qu'il est censé retourner (vrai à une valeur booléenne). En outre, lorsque l'entrée de ligne de commande est: "-4 6 8 2 5 -3 4 3 9", le programme fonctionne et renvoie false au booléen (attendu). Mais, chaque fois que je l'entrée: « 4 -6 8 2 4 3 9 5-3 », le programme affiche l'erreur suivante:

Exception in thread "main" java.lang.NumberFormatException: For input string: "5-3" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Ex5.main(Ex5.java:32) 

Ce qui signifie que mon booléen est faux, et je ne sais pas pourquoi, parce qu'il devrait retourner vrai.

+0

Adrien, un soupçon, au lieu de mettre tout votre code dans la question, limiter problème pour une seule tranche de code. Par exemple: Pourquoi l'expression rationnelle "(? ([0-9] +) -?) + "ne correspond pas à l'entrée" 4 -6 8 2 5-3 4 3 9 " – Doleron

+0

Pourriez-vous utiliser' boolean hasMinuses = listString.contains ("-") '? Si oui, cela vous évitera de déboguer votre regex – dave

+0

Eh bien non, je ne peux pas, je veux permettre - mais seulement quand ce n'est PAS après un numéro –

Répondre

1

S'il vous plaît jeter un oeil à votre (?([0-9]+)-?)+ regex demo: seule 4 6 8 2 5-3 4 3 9 ligne est adaptée en une ligne entière en 4 -6 8 2 5-3 4 3 9, -4 6 8 2 5 -3 4 3 9 et 4 -6 8 2 5-3 4 3 9 sont partiellement appariés. Si vous obtenez faux, cela signifie que vous utilisez la méthode .matches(). Vous pouvez utiliser

(?: ?-?([0-9]+))+ 

Voir ceci regex demo.

Pour obtenir la même fonctionnalité que celle que vous avez actuellement, et si vous l'utilisez avec .matches(), vous obtiendrez toutes les quatre chaînes ci-dessus et le groupe 1 contiendra la dernière partie de chiffres capturés (puisque le modèle contient une capture répétée groupe, seul le dernier numéro sera enregistré dans .group(1)).

Détails

  • ^ (implicite dans .matches()) - début de chaîne
  • (?: ?-?([0-9]+))+ - 1 ou plusieurs occurrences de:
    • ? - un espace optionnel
    • -? - un en option ?
    • ([0-9]+) - Groupe 1: un ou plusieurs chiffres
  • $ (implicite dans .matches()) - fin de la chaîne
+0

Cela fonctionne encore pire que la dernière fois! Maintenant, le booléen est vrai pour n'importe quelle valeur que j'entre, même juste "4 5 6 9" "8 63 3" –

+0

@AdrienAacha Vous n'avez pas expliqué une chose sur la façon dont cela devrait fonctionner. Vous vous êtes plaints seulement de 3 lignes qui ne correspondent pas. J'ai expliqué pourquoi et suggéré un modèle qui fait. –

+0

J'ai explicitement dit qu'il devrait retourner vrai à une valeur booléenne si le signe moins est entre deux nombres mais pas quand il est simplement devant un nombre –

0

Vous pouvez ((\ s) \ d + (- \ d?)?) + Cela fonctionnera dans tous les cas. S'il vous plaît laissez-moi savoir si un cas est échoué. Pour le code Java, vous pouvez utiliser ((\ s) \ d + (\ -? \ D)) +