Correspondance des nombres avec des expressions régulières-seulement des chiffres et des virgules

Je ne sais pas comment construire un regex pour les valeurs d'exemple:

123,456,789
-12,34
1234
-8

Pourriez-vous m'aider?

48
demandé sur ЯegDwight 2010-11-22 16:53:36

10 réponses

si vous ne voulez autoriser que les chiffres et les virgules, ^[-,0-9]+$ est votre regex. Si vous voulez aussi autoriser des espaces, utilisez ^[-,0-9 ]+$ .

cependant, si vous voulez autoriser les nombres appropriés, mieux vaut aller avec quelque chose comme ceci:

^([-+] ?)?[0-9]+(,[0-9]+)?$

ou tout simplement utiliser . analyseur du numéro de réseau (pour les différents numéros, voir MSDN ):

try {
    double.Parse(yourString, NumberStyle.Number);
}
catch(FormatException ex) {
    /* Number is not in an accepted format */
}
37
répondu ThiefMaster 2010-11-22 14:00:56

Qu'est-ce qu'un numéro?

j'ai une question simple pour votre question" simple": qu'entendez-vous exactement par"un nombre"?

  • est-ce que −0 est un numéro?
  • Que pensez-vous de √−1 ?
  • est-ce que ou est un nombre?
  • Est 186,282.42±0.02 milles/seconde nombre - ou est-il deux ou trois d'entre eux?
  • est-ce que 6.02e23 est un numéro?
  • est-ce que 3.141_592_653_589 est un numéro? Pourquoi pas π , ou ? Et −2π⁻³ ͥ ?
  • combien de numéros dans 0.083̄ ?
  • combien de numéros dans 128.0.0.1 ?
  • Quel est le nombre ? Et ⚂⚃ ?
  • Ne 10,5 mm ont un numéro en elle - ou faut-il deux?
  • Est ∛8³ un certain nombre (trois d'entre eux?
  • quel nombre représente ↀↀⅮⅭⅭⅬⅫ AUC , 2762 ou 2009?
  • Sont ४५६७ et ৭৮৯৮ les chiffres?
  • et 0377 , 0xDEADBEEF , et 0b111101101 ?
  • est-ce que Inf est un numéro? NaN ?
  • est-ce que ④② est un numéro? Et ?
  • Que pensez-vous de ?
  • Qu'est-ce que ℵ₀ et ℵ₁ ont à voir avec les nombres? Ou , , et ?

Motifs Suggérés

Aussi, êtes-vous familier avec ces modèles? Pouvez-vous expliquer le pour et le contre de chacun?

  1. /\D/
  2. /^\d+$/
  3. /^\p{Nd}+$/
  4. /^\pN+$/
  5. /^\p{Numeric_Value:10}$/
  6. /^\P{Numeric_Value:NaN}+$/
  7. /^-?\d+$/
  8. /^[+-]?\d+$/
  9. /^-?\d+\.?\d*$/
  10. /^-?(?:\d+(?:\.\d*)?|\.\d+)$/
  11. /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
  12. /^((\d)(?(?=(\d))|$)(?(?{ord==1+ord})(?1)|$))$/
  13. /^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$/
  14. /^(?:(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}))$/
  15. /^(?:(?:[+-]?)(?:[0123456789]+))$/
  16. /(([+-]?)([0123456789]{1,3}(?:,?[0123456789]{3})*))/
  17. /^(?:(?:[+-]?)(?:[0123456789]{1,3}(?:,?[0123456789]{3})*))$/
  18. /^(?:(?i)(?:[+-]?)(?:(?=[0123456789]|[.])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0123456789]+))|))$/
  19. /^(?:(?i)(?:[+-]?)(?:(?=[01]|[.])(?:[01]{1,3}(?:(?:[,])[01]{3})*)(?:(?:[.])(?:[01]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[01]+))|))$/
  20. /^(?:(?i)(?:[+-]?)(?:(?=[0123456789ABCDEF]|[.])(?:[0123456789ABCDEF]{1,3}(?:(?:[,])[0123456789ABCDEF]{3})*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[+-]?)(?:[0123456789ABCDEF]+))|))$/
  21. /((?i)([+-]?)((?=[0123456789]|[.])([0123456789]{1,3}(?:(?:[_,]?)[0123456789]{3})*)(?:([.])([0123456789]{0,}))?)(?:([E])(([+-]?)([0123456789]+))|))/

je soupçonne que certains de ces modèles au-dessus de mai répondre à vos besoins. Mais je ne peux pas vous dire lequel ou des uns - ou, si aucun, VOUS EN fournissez un autre - parce que vous n'avez pas dit ce que vous voulez dire par "nombre".

comme vous le voyez, il y a un nombre énorme de possibilités de nombre: très probablement une valeur de l'un d'eux, en fait. ☺

pour Proposé des Modèles

chaque explication numérotée ci-dessous décrit le schéma du schéma numéroté correspondant indiqué ci-dessus.

  1. Match s'il y a un non-chiffres n'importe où dans la chaîne, y compris les blancs comme sauts de ligne.
  2. correspond seulement si la chaîne ne contient que des chiffres, à l'exception possible d'une coupure de ligne. Notez qu'un chiffre est défini comme ayant le nombre décimal de la catégorie générale de propriété, qui est disponible comme \p{Nd} , \p{Decimal_Number} , ou \p{General_Category=Decimal_Number} . Cette tour est en fait qu'un reflet de ces points de code dont la catégorie de Type numérique est décimale, qui est disponible en tant que \p{Numeric_Type=Decimal} .
  3. c'est le même que 2 dans la plupart des langues regex. Java est une exception ici, parce qu'il n'établit pas de carte des échappées de charclass simples comme \w et \W , \d et \D , \s et \S , et \b ou \B dans la propriété Unicode appropriée. Cela signifie que vous ne devez pas utiliser l'un de ces huit caractères d'évasions pour tout Les données Unicode en Java, parce qu'elles ne fonctionnent que sur ASCII, même si Java utilise toujours des caractères Unicode en interne.
  4. Ce qui est légèrement différent de 3, en ce qu'elle n'est pas limitée à des nombres décimaux, mais peut être n'importe quel nombre; c'est, tout caractère avec les biens \pN , \p{Number} , ou \p{General_Category=Number} . Il s'agit notamment de \p{Nl} ou \p{Letter_Number} pour des choses comme les chiffres romains et \p{No} ou \p{Other_Number} pour des choses comme les souscripteurs et les souscripteurs les nombres, les fractions, et les nombres encerclés-entre autres, comme Compter des tiges.
  5. cela correspond seulement aux chaînes composées entièrement de nombres dont la valeur décimale est 10, donc des choses comme le chiffre romain dix, et , , , , , , et .
  6. seulement les chaînes qui contiennent des caractères qui n'ont pas la valeur numérique NaN; en d'autres termes, tous les caractères doit avoir une valeur numérique.
  7. ne correspond qu'à des nombres décimaux, éventuellement avec un trait D'Union moins.
  8. identique à 7 mais fonctionne maintenant aussi si le signe est plus au lieu de moins.
  9. recherche des nombres décimaux, avec un trait d'Union optionnel moins et un point final optionnel plus des nombres décimaux zéro ou plus suivant.
  10. identique à 9 mais ne nécessite pas de chiffres avant le point s'il y en a après.
  11. notation standard à virgule flottante par C et de nombreuses autres langues, permettant la notation scientifique.
  12. trouve des nombres composés uniquement de deux décimales ou plus de n'importe quel script dans l'ordre décroissant, comme 987 ou 54321. Ce regex récursif inclut un appel au code Perl qui vérifie si le chiffre look ahead a une valeur de point de code qui est le successeur du chiffre courant; c'est-à-dire, sa valeur ordinale est une plus grande. On pourrait le faire dans PCRE en utilisant une fonction C comme la légende.
  13. cherche une adresse IPv4 valide avec quatre nombres décimaux dans l'intervalle de validité, comme 128.0.0.1 ou 255.255.255.240, mais pas 999.999.999.
  14. recherche D'un addr MAC valide, donc six paires de deux-points séparées de deux nombres hexadécimaux ASCII.
  15. recherche des nombres entiers de la gamme ASCII avec un signe avant optionnel. C'est le modèle normal pour assortir des entiers ASCII.
  16. C'est comme 15, sauf qu'il nécessite une virgule pour séparer les groupes de trois.
  17. C'est comme 15, sauf que la virgule pour séparer les groupes, est désormais facultatif.
  18. il s'agit du modèle normal pour apparier les nombres à virgule flottante de style C en ASCII.
  19. c'est comme 18, mais nécessitant une virgule pour séparer les groupes de 3 et dans la base-2 au lieu de dans la base-10.
  20. c'est comme 19, mais en hex. Notez que l'option l'exposant est indiqué par un G au lieu d'un E, puisque E est valide d'un chiffre hexadécimal.
  21. ceci vérifie que la chaîne contient un nombre de virgule flottante de style C, mais avec un séparateur de groupe optionnel tous les trois chiffres d'une virgule ou d'un underscore (ligne basse) entre eux. Il stocke également cette chaîne dans le groupe de capture , ce qui rend disponible comme après le succès du match.

Sources et maintenabilité

motifs numéro 1,2,7-11 proviennent d'une incarnation antérieure de la Perl Foire Aux Questions liste dans la question, "Comment puis-je valider les entrées?". Cette section a été remplacée par une suggestion d'utiliser le module Regexp::Common , écrit par Abigail et Damian Conway . Les motifs originaux peuvent encore être trouvés dans la recette 2.1 du Perl "livres de cuisine 1519950920" , "Vérifier Si une Chaîne Est un Nombre Valide", les solutions qui peuvent être trouvées pour une profusion de diverses langues, y compris ada, common lisp, groovy, de ruse, haskell, java, merd, ocaml, php, brochet, python, rexx, ruby et tcl à la la PLEAC projet .

le modèle 12 pourrait être réécrit de façon plus lisible

m{
    ^
    (
        ( \d )
        (?(?= ( \d ) ) | $ )
        (?(?{ ord  == 1 + ord  }) (?1) | $ )
    )
    $
}x

il utilise regex recursion , qui se trouve dans de nombreux modèles de moteurs, y compris Perl et tous les langages dérivés PCRE. Mais il utilise aussi un callout de code intégré comme test de son second pattern conditionnel; à ma connaissance, les callouts de code ne sont disponibles qu'en Perl et PCRE.

Les patrons

13-21 ont été dérivés du module Regexp::Common susmentionné. Notez que par souci de brièveté, ils sont tous écrits sans les espaces et les commentaires que vous voudriez certainement dans le code de production. Voici comment cela pourrait ressembler dans /x mode:

$real_rx = qr{ (   # start  to hold entire pattern
    ( [+-]? )                  # optional leading sign, captured into 
    (                          # start 
        (?=                    # look ahead for what next char *will* be
            [0123456789]       #    EITHER:  an ASCII digit
          | [.]                #    OR ELSE: a dot
        )                      # end look ahead
        (                      # start 
           [0123456789]{1,3}       # 1-3 ASCII digits to start the number
           (?:                     # then optionally followed by
               (?: [_,]? )         # an optional grouping separator of comma or underscore
               [0123456789]{3}     # followed by exactly three ASCII digits
           ) *                     # repeated any number of times
        )                          # end 
        (?:                        # begin optional cluster
             ( [.] )               # required literal dot in 
             ( [0123456789]{0,} )  # then optional ASCII digits in 
        ) ?                        # end optional cluster
     )                         # end 
    (?:                        # begin cluster group
        ( [E] )                #   base-10 exponent into 
        (                      #   exponent number into 
            ( [+-] ? )         #     optional sign for exponent into 
            ( [0123456789] + ) #     one or more ASCII digits into 
        )                      #   end 
      |                        #   or else nothing at all
    )                          # end cluster group
) }xi;          # end  and whole pattern, enabling /x and /i modes

du point de vue de l'ingénierie logicielle, il y a encore plusieurs problèmes avec le style utilisé dans la version en mode /x immédiatement ci-dessus. Tout d'abord, il y a beaucoup de répétition de code, où vous voyez le même [0123456789] ; que se passe-t-il si l'une de ces séquences laisse accidentellement un chiffre dehors? Deuxièmement, vous vous en remettez aux paramètres de position, que vous devez compter. Cela signifie que vous pourriez écrire quelque chose comme:

(
  $real_number,          # 
  $real_number_sign,     # 
  $pre_exponent_part,    # 
  $pre_decimal_point,    # 
  $decimal_point,        # 
  $post_decimal_point,   # 
  $exponent_indicator,   # 
  $exponent_number,      # 
  $exponent_sign,        # 
  $exponent_digits,      # 
) = ($string =~ /$real_rx/);

ce qui est franchement abominable! Il est facile d'obtenir la numérotation erronée, difficile de se rappeler quels noms symboliques vont où, et fastidieux à écrire, surtout si vous n'avez pas besoin de toutes ces pièces. Réécrire ça pour utiliser des groupes nommés au lieu de simplement numérotés. Encore une fois, j'utiliserai la syntaxe Perl pour les variables, mais le contenu du Pattern devrait fonctionner n'importe où que les groupes nommés soient pris en charge.

use 5.010;              # Perl got named patterns in 5.10
$real_rx = qr{
  (?<real_number>
    # optional leading sign
    (?<real_number_sign> [+-]? )
    (?<pre_exponent_part>
        (?=                         # look ahead for what next char *will* be
            [0123456789]            #    EITHER:  an ASCII digit
          | [.]                     #    OR ELSE: a dot
        )                           # end look ahead
        (?<pre_decimal_point>
            [0123456789]{1,3}       # 1-3 ASCII digits to start the number
            (?:                     # then optionally followed by
                (?: [_,]? )         # an optional grouping separator of comma or underscore
                [0123456789]{3}     # followed by exactly three ASCII digits
            ) *                     # repeated any number of times
         )                          # end <pre_decimal_part>
         (?:                        # begin optional anon cluster
            (?<decimal_point> [.] ) # required literal dot
            (?<post_decimal_point>
                [0123456789]{0,}  )
         ) ?                        # end optional anon cluster
   )                                # end <pre_exponent_part>
   # begin anon cluster group:
   (?:
       (?<exponent_indicator> [E] ) #   base-10 exponent
       (?<exponent_number>          #   exponent number
           (?<exponent_sign>   [+-] ?         )
           (?<exponent_digits> [0123456789] + )
       )                      #   end <exponent_number>
     |                        #   or else nothing at all
   )                          # end anon cluster group
 )                            # end <real_number>
}xi;

maintenant les abstractions sont nommées, ce qui aide. Vous pouvez retirer les groupes par leur nom, et vous n'avez besoin que de ceux auxquels vous tenez. Par exemple:

if ($string =~ /$real_rx/) {
    ($pre_exponent, $exponent_number) =
        @+{ qw< pre_exponent exponent_number > };
}

il y a encore une chose à faire ce modèle pour le rendre encore plus supportable. Le problème, c'est qu'il y a encore trop de répétitions, ce qui veut dire qu'il est trop facile de le changer à un endroit, mais pas à un autre. Si vous faisiez une analyse McCabe, vous diriez que sa métrique de complexité est trop haut. La plupart d'entre nous dirions que c'est trop indenté. De ce fait, il est difficile de suivre. Pour corriger toutes ces choses, ce dont nous avons besoin est un "modèle grammatical", un avec un bloc de définition pour créer des abstractions nommées, que nous traitons ensuite un peu comme un appel de sous-programme plus tard dans le match.

use 5.010;              # Perl first got regex subs in v5.10
$real__rx = qr{ 

    ^                   # anchor to front
    (?&real_number)     # call &real_number regex sub
    $                   # either at end or before final newline

  ##################################################
  # the rest is definition only; think of         ##
  # each named buffer as declaring a subroutine   ##
  # by that name                                  ##
  ##################################################
  (?(DEFINE)
      (?<real_number>
          (?&mantissa)
          (?&abscissa) ?

      )
      (?<abscissa>
          (?&exponent_indicator)
          (?&exponent)
      )
      (?<exponent>
          (&?sign)    ?
          (?&a_digit) +
      )
      (?<mantissa>
         # expecting either of these....
         (?= (?&a_digit)
           | (?&point)
         )
         (?&a_digit) {1,3}
         (?: (?&digit_separator) ?
             (?&a_digit) {3}
         ) *
         (?: (?&point)
             (?&a_digit) *
         ) ?
      )
      (?<point>               [.]     )
      (?<sign>                [+-]    )
      (?<digit_separator>     [_,]    )
      (?<exponent_indicator>  [Ee]    )
      (?<a_digit>             [0-9]   )
   ) # end DEFINE block
}x;

Voir comment incroyablement mieux la composition grammaticale est que la ligne d'origine-noisy modèle? Il est également beaucoup plus facile d'obtenir la bonne syntaxe: I j'ai tapé ça sans même une erreur de syntaxe de regex à corriger. (Ok bien, j'ai tapé tous les autres sans aucune erreur de syntaxe non plus, mais je fais ça depuis un moment. :)

les modèles grammaticaux ressemblent beaucoup plus à un BNF que les moches vieilles expressions régulières que les gens ont fini par détester. Ils sont beaucoup plus faciles à lire, à écrire et à maintenir. Alors arrêtons d'avoir des motifs moches, D'accord?

464
répondu tchrist 2017-07-21 23:11:23

essayez ceci:

^-?\d{1,3}(,\d{3})*(\.\d\d)?$|^\.\d\d$

permet:

1
12
.99
12.34 
-18.34
12,345.67
999,999,999,999,999.99
9
répondu Gary Green 2010-11-22 14:03:40

puisque cette question a été réouverte quatre ans plus tard, j'aimerais offrir une autre perspective. Comme quelqu'un passe beaucoup de temps à travailler avec regex, mon point de vue est celui-ci:

A. Si possible, n'utilisez pas Regex pour valider les numéros

, Si possible, utilisez votre langue. Il peut y avoir des fonctions pour vous aider à déterminer si la valeur contenue par une chaîne est un nombre valide. Ceci étant dit, si vous acceptez une variété des formats (virgules, etc.) vous ne pouvez pas avoir un choix.

B. N'écrivez pas le Regex manuellement pour valider une plage de nombres

  • Écrire un regex pour correspondre à un nombre dans une gamme donnée est difficile. Vous pouvez faire une erreur même en écrivant un regex à correspondent à un nombre entre 1 et 10 .
  • une fois que vous avez un regex pour une gamme de nombres, il est difficile de déboguer. Tout d'abord, c'est horrible à regarder à. Deuxièmement, comment pouvez-vous être sûr qu'il correspond à toutes les valeurs que vous voulez sans correspondant à chacune des valeurs que vous ne voulez pas? franchement, si vous êtes seul, sans pairs qui vous regardent par-dessus votre épaule, vous ne pouvez pas. La meilleure technique de débogage est de sortir toute une gamme de nombres par programmation et de les vérifier par rapport au regex.
  • heureusement, il existe des outils pour générer automatiquement un regex pour une gamme de nombres.

C. dépensez votre énergie Regex à bon escient: utilisez des outils

  • les nombres correspondants dans une plage donnée sont un problème qui a été résolu. Il n'y a pas besoin pour vous d'essayer de réinventer la roue. C'est un problème qui peut être résolu mécaniquement, par un programme, d'une manière qui est garantie d'être sans erreur. Profitez de ce tour gratuit.
  • résoudre un nombre gamme regex peut être intéressant à des fins d'apprentissage a couple de fois. Au-delà de cela, si vous avez l'énergie d'investir dans l'amélioration de vos compétences regex, dépenser sur quelque chose d'utile, comme l'approfondissement de votre compréhension de avidité regex , la lecture sur Unicode regex , jouer avec des allumettes de largeur zéro ou la récursion, la lecture du so regex FAQ et la découverte astuces soignées telles que la façon de exclure certains modèles d'une correspondance regex ... ou lire des classiques telles que Matering Expressions Régulières, 3e Éd ou Les Expressions Régulières livre de cuisine, 2e Éd .

pour les outils, vous pouvez utiliser:

  • En Ligne: Regex_for_range
  • Hors ligne: le seul que je connais est RegexMagic (pas libre) par regex gourou Jan Goyvaerts. C'est son produit débutant regex, et comme je me souviens il a une grande gamme des options pour générer des nombres dans une plage donnée, entre autres caractéristiques.
  • si les conditions sont trop complexes, auto-générer deux plages... puis rejoignez-les avec un opérateur d'alternance |

D. Un Exercice: construire une Regex pour les Specs à la Question

ces spécifications sont assez larges... mais pas nécessairement vague. Regardons à nouveau les valeurs de l'échantillon:

123,456,789
-12,34
1234
-8

Quel est le rapport entre les deux premières valeurs? Dans la première, la virgule correspond aux groupes de trois puissances. Dans le second, il correspond probablement au point décimal dans un format de nombre de type continental-européen. Cela ne veut pas dire que nous devrions autoriser les chiffres partout, comme dans 1,2,3,44 . De même, nous ne devrions pas être restrictifs. Le regex dans la réponse acceptée, par exemple, ne correspondra pas à l'une des exigences, 123,456,789 (voir demo ).

comment construire notre regex pour correspondre aux spécifications?

  • ancrons l'expression entre ^ et $ pour éviter les sous-échantillons
  • permet une option moins: -?
  • faisons correspondre deux types de nombres de chaque côté d'une alternance (?:this|that) :
  • à gauche, un chiffre de style européen avec virgule facultative pour la partie décimale: [1-9][0-9]*(?:,[0-9]+)?
  • sur la droite, un nombre avec des milliers de séparateurs: [1-9][0-9]{1,2}(?:,[0-9]{3})+

L'expression régulière suivante:

^-?(?:[1-9][0-9]*(?:,[0-9]+)?|[1-9][0-9]{1,2}(?:,[0-9]{3})+)$

Voir démo .

ce regex ne permet pas les numéros de style européen commençant par 0 , tels que 0,12 . C'est une fonctionnalité, pas un bug. Pour faire correspondre ceux-ci aussi, un petit tweak fera:

^-?(?:(?:0|[1-9][0-9]*)(?:,[0-9]+)?|[1-9][0-9]{1,2}(?:,[0-9]{3})+)$

Voir démo .

6
répondu zx81 2017-05-23 12:18:23

essayez ceci:

^-?[\d\,]+$

il permettra une option - comme premier caractère, puis toute combinaison de virgules et de chiffres.

4
répondu Klaus Byskov Pedersen 2010-11-22 13:56:19
^-?    # start of line, optional -
(\d+   # any number of digits
|(\d{1,3}(,\d{3})*))  # or digits followed by , and three digits
((,|\.)\d+)? # optional comma or period decimal point and more digits
$  # end of line
3
répondu Andrew 2012-06-28 15:30:57
^[-+]?(\d{1,3})(,?(?1))*$

Regular expression visualization

Debuggex Démo

alors qu'est-ce que ça fait?!

  • ^ marque le début de la chaîne de caractères
  • [-+]? permet un moins ou plus juste après le début de la chaîne de caractères
  • (\d{1,3}) correspond au moins un et au maximum trois ( {1,3} ) chiffres ( \d - communément [0-9] ) dans une rangée et les groupe (les parenthèses (...) construit le groupe) comme le premier groupe
  • (,?(?1))* ok... analysons tout cela
    • (...) construit un autre groupe ( pas si important )
    • ,? correspond à une virgule (si elle existe) juste après la première séquence de chiffres
    • (?1) correspond à nouveau au motif du premier groupe (se souvenir de (\d{1,3}) ); en mots: à ce point l'expression correspond à un signe (plus/minus/none) suivi d'une séquence de chiffres éventuellement suivie d'une virgule, suivie d'une autre séquence de chiffres à nouveau.
    • (,?(?1))* , le * répète la deuxième partie (virgule Et séquence) aussi souvent que possible
  • $ enfin, correspond à la fin de la chaîne

l'avantage de telles expressions est d'éviter de définir le même modèle dans votre expression encore et encore et encore... et bien, un inconvénient est parfois la complexité: - /

2
répondu bukart 2014-06-28 10:43:28

en java, vous pouvez utiliser java.util.Scanner avec sa useLocale méthode

Scanner myScanner =  new Scanner(input).useLocale( myLocale)

isADouble = myScanner.hasNextDouble()
0
répondu Jorge DeFlon Developer 2014-06-23 10:23:11

pour les exemples:

    ^(-)?([,0-9])+$

ça devrait marcher. Implémentez - le dans la langue de votre choix.

-2
répondu arunKr 2014-06-25 13:01:41

essayez ceci:

    boxValue = boxValue.replace(/[^0-9\.\,]/g, "");

ce RegEx ne correspond qu'à des chiffres, des points et des virgules.

-2
répondu Narasimha 2015-10-11 00:23:41