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.

Richard
la source
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.

user113716
la source
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");
}
Abhijeet Kasurde
la source
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
pmrotule
la source
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.

user278064
la source
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');
user2449231
la source
6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));
Eysun
la source
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>
Tongi
la source
1

veuillez essayer cette fleur:

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

vrai

Jaber Alshami
la source
1

essayer

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

Kamil Kiełczewski
la source
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]
Juan Navarrete
la source
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
Geetanshu Gulati
la source