Je sais que je peux correspondre aux numéros avec mais il ne gère pas les longues valeurs min / max. p> < p> Pour les problèmes de performance liés aux exceptions, je ne veux pas essayer d'analyser la longue sauf si c'est vraiment un long. p> je veux dire que je ne veux pas d'essayer / attraper bloc et je ne veux pas faire des exceptions soulevées pendant une longue comme « 564654954654464654654567879865132154778 » qui est de la taille d'une longue Java régulière. quelqu'un Finalité p> a un modèle pour gérer ce genre de besoin pour la primitive types Java?
Le JDK fournit-il quelque chose à le gérer automatiquement?
Y a-t-il un mécanisme d'analyse sans danger dans Java? P> Merci P> Je ne trouve pas le Link à nouveau mais il y a une belle analyse d'analyse sur Stackoverflow, ce qui montre clairement que la réutilisation de la regex compilée Sams est vraiment rapide, beaucoup plus rapide que de jeter une exception, ce n'est donc qu'un petit seuil d'exceptions qui rendrait le système plus lentement que par la vérification de la regex supplémentaire. . p> p> motif.comple ("\\ d *"); code>
3 Réponses :
Catchez simplement la formatException, à moins que ce cas ne se produise très souvent. P>
Une autre manière serait d'utiliser un motif qui permet uniquement de longues littérales. Un tel motif pourrait être assez complexe. P>
Une troisième voie serait d'analyser le nombre comme de la première fois. Ensuite, vous pouvez le comparer à long.max_value et long.min_value pour vérifier si elle est dans les limites de long. Cependant, cela pourrait être coûteux aussi. P>
Notez également: L'analyse longue est assez rapide, c'est une méthode très optimisée (que, par exemple, essaie d'analyser deux chiffres en une seule étape). L'application de la correspondance des motifs peut être encore plus coûteuse que d'analyser l'analyse. La seule chose qui est lente à propos de l'analyse consiste à lancer la nobleFormeXception. Ainsi, simplement attraper l'exception est la meilleure façon d'aller si le cas exceptionnel n'arrive pas trop souvent em> p>
L'OP a dit: "pour les problèmes de performance liés aux exceptions que je ne veux pas essayer d'analyser la longue sauf si elle n'est vraiment longue" i>
L'idée est d'obtenir un temps d'exécution constant pour la méthode au lieu d'un délai d'exécution relatif à la présence de mauvaises valeurs longues. Autant que je sache, j'ai lu une référence sur SO et Regex, lorsqu'il n'est pas recompanté à chaque fois, sont assez rapides
Je lis le Code source de Parselong code>
, mais je ne trouve aucune preuve de l'analyse de deux points de deux-deux.
Le minimum avlue d'un SO grossièrement em>: p> ... ou quelque chose le long de ces lignes, et en supposant Vous ne laissez pas les virgules (ou les avez déjà supprimés). p> Comme le souligne Gexicide dans les commentaires, ce qui précède permet une petite gamme de valeurs non valides (en comparaison), telles que long code> est
-9,223,372,036,854,775 808 code> et la valeur maximale est
9,223,372,807 code>. Donc, un maximum de 19 chiffres. Ainsi,
\ d {1,19} code> devrait vous y arriver, peut-être avec un
- code>, et avec
^ code> et
$ < / code> pour correspondre aux extrémités de la chaîne.
9 999 9999999999999999999999999,999 / code>. Vous pouvez obtenir plus complexe avec votre regex ou simplement accepter que ce qui précède éliminera la grande majorité des nombres invalides et que vous réduisez ainsi le nombre d'exceptions d'analyse que vous obtenez. P> P>
Pas vrai, votre modèle permet le numéro 9 999 9999999999999999999, qui n'est pas à la longue portée
@GoxxIDE: True, un peu de réglage peut être nécessaire. Il serait au moins très vaste réduire i> le nombre d'exceptions.
Bien sûr, mais je suppose que OP veut une solution correcte. Mais je suis d'accord, le motif filtre déjà le plus mauvais cas.
merci, c'est ce que je pensais aussi -> limiter le nombre de chiffres
pouvez-vous expliquer le "-" s'il vous plaît je ne trouve pas cela dans le modèle Javadoc
@Sebastienlorber: le - code> est un
- code> (pour permettre des nombres négatifs), c'est pourquoi vous ne l'avez pas trouvé dans Javadoc. :-) Le
? Code> après cela signifie "zéro ou une fois" (qui est dans le Javadoc). E.g.,
? Code> est un raccourci pour
{0,1} code>.
Oooh merci je suis stupide ^^ mais je veux juste que je veux juste des valeurs positives alors je ne pensais pas à - comme le long signe
Cette expression régulière devrait faire ce dont vous avez besoin: p>
mais cette refente ne valide pas les symboles supplémentaires tels que ^ (- 9223372036854775808 | 0) $ | ^ (((-?) ((?! 0) \ D {1,18} | [1-8] \ D {18} | 9 [0- 1] \ d {17} | 92 [0-1] \ d {16} | 922 [0-2] \ D {15} | 9223 [0-2] \ D {14} | 92233 [0-6] \ D {13} | 922337 [0-1] \ d {12} | 92233720 [0-2] \ D {10} | 922337203 [0-5] \ D {9} | 9223372036 [0-7] \ D {8} | 92233720368 [0-4] \ D {7} | 922337203685 [0-3] \ D {6} | 9223372036854 [0-6] \ D {5} | 92233720368547 [0-6] \ D {4 } | 922337203685477 [0-4] \ D {3} | 9223372036854775 [0-7] \ D {2} | 922337203685477580 [0-7])) $ code> p> p>
+ code>,
l code>,
_ code> et etc. Et si vous devez valider tout ce qui est possible. Valeurs longues dont vous avez besoin pour mettre à niveau cette REGEXP. P>
Notez que
"\\ d *" code> correspond aussi à des cordes vides.
Éventuellement Votre question a déjà été posée a >. À mon avis, des exceptions seront plus rapides que les expressions régulières.
@Sorrow: bonne prise sur la question précédente. Des exceptions contre des expressions régulières: qu'est-ce qui vous fait penser que? Lancer des exceptions n'est pas un processus rapide. Une fois compilé, les expressions régulières sont assez rapides.
Comme indiqué dans ma réponse, tout dépend de la fréquence à laquelle l'affaire exceptionnelle se produit. Avec le motif correspondant, vous faites le travail supplémentaire tout le temps i>, avec des exceptions, le travail supplémentaire n'est effectué que lorsque l'exception est soulevée.
@Sorness, un motif précompilé surperformera une exception à emporter. Mais un numéro (string) qui conviendra à un
long code> serait plus rapide de vérifier quand
long.parelong (...) code> ne jette pas une exception.
Je suis d'accord avec @goxicide ici - tout dépend de la fréquence à laquelle les exceptions sont capturées, car les regexps sont contrôlés toujours, peu importe quoi. Il me semble que combiner ce que T.J. Crowder répondit (
-? \\ d {1,19} code>) avec une prise d'exception devrait être à peu près optimale, alors.