Vérifiez si une chaîne correspond à une expression régulière dans JS


752

Je veux utiliser JavaScript (peut être avec jQuery) pour faire une validation côté client pour vérifier si une chaîne correspond à l'expression régulière:

^([a-z0-9]{5,})$

Idéalement, ce serait une expression qui retournerait vrai ou faux.

Je suis un débutant JavaScript, fait match()ce dont j'ai besoin? Il semble vérifier si une partie d'une chaîne correspond à une expression régulière, et non pas le tout.


Voulez-vous une correspondance complète, ou simplement si la chaîne contient une sous-chaîne correspondante?
Kerrek SB

1
Une correspondance complète - pas une sous-chaîne correspondante.
Richard

Réponses:


1196

A utiliser regex.test()si tout ce que vous voulez est un résultat booléen:

console.log(/^([a-z0-9]{5,})$/.test('abc1')); // false

console.log(/^([a-z0-9]{5,})$/.test('abc12')); // true

console.log(/^([a-z0-9]{5,})$/.test('abc123')); // true

... et vous pouvez supprimer le ()de votre regexp puisque vous n'avez pas besoin d'une capture.


1
Que fait l'initiale ^ dans l'expression régulière?
PedroD

8
@PedroD ^ implique un début ou commence par
Nagaraju

Alors, comment feriez-vous le contraire? "ne commence pas par ..."
PedroD


3
@stackdave travaillez-vous peut-être avec Java, plutôt qu'avec JavaScript?
sfarbota

176

Utilisez la test()méthode:

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}

3
Notez que la version avec RegExppermet d'injecter des valeurs variables dans la chaîne d'expression régulière.
Christophe Roussy

2
a dû supprimer les guillemets doubles new RegExp("^([a-z0-9]{5,})$")afin de le faire fonctionner
Facundo Colombier

98

Vous pouvez également utiliser match():

if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

Mais test()semble être plus rapide comme vous pouvez le lire ici .

Différence importante entre match()et test():

match()fonctionne uniquement avec des chaînes, mais test()fonctionne également avec des entiers.

12345.match(/^([a-z0-9]{5,})$/); // ERROR
/^([a-z0-9]{5,})$/.test(12345);  // true
/^([a-z0-9]{5,})$/.test(null);   // false

// Better watch out for undefined values
/^([a-z0-9]{5,})$/.test(undefined); // true

La raison pour laquelle cela fonctionne avec un nombre est que le nombre est contraint dans une chaîne, car il est donné en paramètre lorsqu'il attend une chaîne. Je ne compterais pas sur ce comportement. Cela dépend de l'implémentation de test () dans votre environnement. (la correspondance échoue car les numéros n'ont pas de matchmembre). Je recommanderais de convertir explicitement votre numéro en une chaîne si vous souhaitez l'utiliser avec une expression régulière ( String(123)par exemple).
Bronzdragon

La correspondance peut être utilisée ici, mais si vous regardez les performances, elle testfonctionne 30% mieux lorsque nous voulons simplement valider une chaîne pour correspondre à l'expression régulière et non en extraire des sous-chaînes.
Akansh

@pmrotule Oui, mais il faut le mentionner avant la description du match.
Akansh

La différence la plus significative entre test et match (et matchAll) est que match fait des choses comme retourner une liste de toutes les sous-chaînes correspondantes, tandis que test vérifie seulement s'il y en a. Vérifiez les méthodes d'expression régulière dans javascript.info/regexp-methods
Juan Lanus

50

Utilisez-le /youregexp/.test(yourString)si vous voulez seulement savoir si votre chaîne correspond à l'expression rationnelle.


8

Voici un exemple qui recherche certaines balises HTML, il est donc clair que /someregex/.test()renvoie un booléen:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');

6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));

2

Vous pouvez essayer ça, ça marche pour moi.

 <input type="text"  onchange="CheckValidAmount(this.value)" name="amount" required>

 <script type="text/javascript">
    function CheckValidAmount(amount) {          
       var a = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
       if(amount.match(a)){
           alert("matches");
       }else{
        alert("does not match"); 
       }
    }
</script>

1

veuillez essayer cette fleur:

/^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('abc@abc.abc');

vrai


1

essayer

 /^[a-z\d]{5,}$/.test(str)


2
Quelle nouvelle valeur cette réponse de code uniquement apporte-t-elle à la page?
mickmackusa

actuellement c'est la solution la plus courte (en raison de la simplification des expressions rationnelles)
Kamil Kiełczewski

1
Raser 1 caractère des modèles publiés il y a des années. Bâillement.
mickmackusa

2
Il suffit de laisser un commentaire sous une réponse antérieure pour indiquer que la 0-9réduction peut être effectuée aaaaaaaaaaaaaaaaaaaaaa \d. Oh, et qu'un groupe de capture n'est pas nécessaire.
mickmackusa

1

Je recommanderais d'utiliser la méthode execute qui retourne null si aucune correspondance n'existe sinon elle retourne un objet utile.

let case1 = /^([a-z0-9]{5,})$/.exec("abc1");
console.log(case1); //null

let case2 = /^([a-z0-9]{5,})$/.exec("pass3434");
console.log(case2); // ['pass3434', 'pass3434', index:0, input:'pass3434', groups: undefined]

0
const regExpStr = "^([a-z0-9]{5,})$"
const result = new RegExp(regExpStr, 'g').test("Your string") // here I have used 'g' which means global search
console.log(result) // true if it matched, false if it doesn't
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.