427 votes

Regex pour vérifier si une chaîne ne contient que des chiffres

hash = window.location.hash.substr(1);
var reg = new RegExp('^[0-9]$');
console.log(reg.test(hash));

Je reçois des faux sur les deux "123" et "123f" . Je voudrais vérifier si le hachage ne contient que des chiffres. Est-ce que j'ai raté quelque chose ?

3 votes

Selon W3schools, ^ ne nie les séquences que lorsque à l'intérieur de la parenthèse, donc [^0-9] se réfère aux non-chiffres, mais ^[0-9] indique "début de ligne".

692voto

Mike Samuel Points 54712
var reg = /^\d+$/;

devrait le faire. L'original correspond à tout ce qui est composé d'exactement un chiffre.

10 votes

@vsync, parce que \d dans une chaîne entre guillemets est la lettre 'd'. Essayez d'exécuter '/^\d+$/' === '/^d+$/' dans votre console JavaScript. Vous devez effectuer un double échappement lorsque vous intégrez une RegExp dans une chaîne de caractères : eval('/^\\d+$/')

0 votes

@vsync Pourquoi voulez-vous le faire ?

5 votes

Il ne prend pas en compte les nombres négatifs.

162voto

shadyabhi Points 5924

Comme vous l'avez dit, vous voulez que le hachage ne contienne que des chiffres.

var reg = new RegExp('^[0-9]+$');

ou

var reg = new RegExp('^\\d+$');

\d et [0-9] Les deux signifient la même chose. Le + utilisé signifie que l'on recherche une ou plusieurs occurrences de [0-9].

86voto

codename- Points 1712

Celui-ci permettra également d'utiliser des nombres signés et flottants ou des chaînes vides :

var reg = /^-?\d*\.?\d*$/

Si vous ne voulez pas autoriser la chaîne vide, utilisez celle-ci :

var reg = /^-?\d+\.?\d*$/

0 votes

Votre deuxième regex a été très utile. Elle est juste restée bloquée lors de la validation d'un nombre comme .378. Pourriez-vous me dire comment modifier /^- ? \d + \. ? \d *$/ pour qu'il valide également .378

1 votes

Changement + en * : ^-?\d*\.?\d*$ . + signifie que vous cherchez au moins un numéro sur le devant, * en cherchant un nombre nul ou multiple.

3 votes

Pour une meilleure flottaison, utilisez /^- ? \d +( \.\d +)?$/

70voto

Dastagir Points 172
var validation = {
    isEmailAddress:function(str) {
        var pattern =/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
        return pattern.test(str);  // returns a boolean
    },
    isNotEmpty:function (str) {
        var pattern =/\S+/;
        return pattern.test(str);  // returns a boolean
    },
    isNumber:function(str) {
        var pattern = /^\d+$/;
        return pattern.test(str);  // returns a boolean
    },
    isSame:function(str1,str2){
        return str1 === str2;
    }
};   

alert(validation.isNotEmpty("dff"));
alert(validation.isNumber(44));
alert(validation.isEmailAddress("mf@tl.ff"));
alert(validation.isSame("sf","sf"));

3 votes

Utilité très utile

11voto

Juan Lanus Points 677

Cette fonction vérifie si l'entrée est numérique au sens classique du terme, comme on s'attend à ce qu'une fonction normale de détection de nombres fonctionne.

C'est un test que l'on peut utiliser pour la saisie de formulaires HTML, par exemple.

Il permet de contourner tout le folklore JS, comme tipeof(NaN) = nombre, parseint('1 Kg') = 1, les booléens transformés en nombres, etc.

Il le fait en rendant l'argument comme une chaîne et en vérifiant cette chaîne contre une regex comme celles de @codename- mais en permettant des entrées comme 5. et .5

function isANumber( n ) {
    var numStr = /^-?(\d+\.?\d*)$|(\d*\.?\d+)$/;
    return numStr.test( n.toString() );
}

not numeric:
Logger.log( 'isANumber( "aaa" ): ' + isANumber( 'aaa' ) );
Logger.log( 'isANumber( "" ): ' + isANumber( '' ) );
Logger.log( 'isANumber( "lkjh" ): ' + isANumber( 'lkjh' ) );
Logger.log( 'isANumber( 0/0 ): ' + isANumber( 0 / 0 ) );
Logger.log( 'isANumber( 1/0 ): ' + isANumber( 1 / 0 ) );
Logger.log( 'isANumber( "1Kg" ): ' + isANumber( '1Kg' ) );
Logger.log( 'isANumber( "1 Kg" ): ' + isANumber( '1 Kg' ) );
Logger.log( 'isANumber( false ): ' + isANumber( false ) );
Logger.log( 'isANumber( true ): ' + isANumber( true ) );

numeric:
Logger.log( 'isANumber( "0" ): ' + isANumber( '0' ) );
Logger.log( 'isANumber( "12.5" ): ' + isANumber( '12.5' ) );
Logger.log( 'isANumber( ".5" ): ' + isANumber( '.5' ) );
Logger.log( 'isANumber( "5." ): ' + isANumber( '5.' ) );
Logger.log( 'isANumber( "-5" ): ' + isANumber( '-5' ) );
Logger.log( 'isANumber( "-5." ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "-.5" ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "1234567890" ): ' + isANumber( '1234567890' ));

Explication de la regex :

/^-?(\d+\.?\d*)$|(\d*\.?\d+)$/  

Le "^" initial et le "$" final correspondent au début et à la fin de la chaîne de caractères, afin de garantir que la vérification couvre l'ensemble de la chaîne. La partie "- ?" est le signe moins avec le multiplicateur " ?" qui permet d'en avoir zéro ou une instance.

Ensuite, il y a deux groupes similaires, délimités par des parenthèses. La chaîne doit correspondre à l'un ou l'autre de ces groupes. Le premier correspond à des nombres comme 5. et le second à .5.

Le premier groupe est

\d+\.?\d*

Le " \d +" correspond à un chiffre ( \d ) une ou plusieurs fois.
Le " \. ?" est le point décimal (échappé avec "\" pour le priver de sa magie), zéro ou une fois.

La dernière partie " \d *" est à nouveau un chiffre, zéro ou plusieurs fois.
Toutes les parties sont facultatives, sauf le premier chiffre, ce qui fait que ce groupe correspond à des nombres comme 5. et non .5, qui correspond à l'autre moitié.

0 votes

4.5.3 est vrai pour votre regex

1 votes

/^[\+\-] ? \d * \. ? \d +(? :[Ee][\\\-] ? \d +)?$/

0 votes

@RicheveBebedor Sympa, votre version supprime le truc de l'exposant, ce qui est bien pour les cas où c'est nécessaire, comme dans l'ingénierie ou les entrées astronomiques. Je l'ai omis exprès pour trouver un regexp qui renverrait l'ensemble minimum de valeurs d'entrée d'argent valides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X