Considérons que nous avons une chaîne de caractères +7(903)-123-45-67 et que nous voulons trouver tous les nombres dedans. Mais contrairement à avant nous ne voulons pas seulement trouver les chiffres mais les nombres en entier: 7, 903, 123, 45, 67.
Un nombre est une séquence de 1 ou plus chiffres \d. Pour marquer la quantité dont nous avons besoin, nous pouvons ajouter un quantificateur.
Quantité {n}
Le quantificateur le plus simple est un nombre entre accolades: {n}.
Un quantificateur est attaché à un caractère (ou une classe de caractère, ou un jeu [...], etc) et spécifie la quantité dont nous avons besoin.
Il a quelques formes avancées, comme par exemple:
- Le nombre exact:
{5} -
\d{5}indique exactement 5 chiffres, identique Ã\d\d\d\d\d.Lâexemple ci-dessous recherche un nombre à 5 chiffres:
alert( "I'm 12345 years old".match(/\d{5}/) ); // "12345"Nous pouvons ajouter
\bpour exclure les nombres plus longs:\b\d{5}\b. - La portée:
{3,5}, correspond de 3 Ã 5 fois -
Pour trouver les nombres avec de 3 Ã 5 chiffres nous pouvons mettre les limites entre accolades:
\d{3,5}alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"Nous pouvons retirer la limite haute.
Une regexp
\d{3,}cherche donc une séquence de chiffres dâune longueur de 3 ou plus:alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"
Retournons à la chaîne de caractères +7(903)-123-45-67.
Un nombre est une séquence de un ou plus chiffres à la suite. Donc la regexp est \d{1,}:
let str = "+7(903)-123-45-67";
let numbers = str.match(/\d{1,}/g);
alert(numbers); // 7,903,123,45,67
Abréviations
Il y a des abréviations pour les quantificateur les plus utilisés:
+-
Signifie âun ou plusâ, identique Ã
{1,}.Par exemple,
\d+cherche les nombres:let str = "+7(903)-123-45-67"; alert( str.match(/\d+/g) ); // 7,903,123,45,67 ?-
Signifie âzéro ou unâ, identique Ã
{0,1}. En dâautres termes, il rend le symbole optionnel.Par exemple, le pattern
ou?rchercheosuivi de zéro ou unu, puisr.Donc,
colou?rtrouvecoloretcolour:let str = "Should I write color or colour?"; alert( str.match(/colou?r/g) ); // color, colour *-
Signifie âzéro ou plusâ, identique Ã
{0,}. Câest-à -dire que le caractère peut être répété nâimporte quel nombre de fois ou bien être absent.Par exemple,
\d0*cherche un chiffre suivi de nâimporte quel nombre de zéros (plusieurs ou aucun):alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1Comparé Ã
+(un ou plus):alert( "100 10 1".match(/\d0+/g) ); // 100, 10 // 1 n'est pas trouvé, puisque 0+ nécessite au moins un zéro
Plus dâexemples
Les quantificateurs sont utilisés très souvent. Ils servent de âbloc de constructionâ principal pour les expressions régulières complexes, regardons dâautres exemples.
Regexp pour fractions décimales (un nombre à virgule flotante): \d+\.\d+
En action:
alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345
Regexp pour une âbalise HTML dâouverture sans attributsâ, comme <span> ou <p>.
-
La plus simple:
/<[a-z]+>/ialert( "<body> ... </body>".match(/<[a-z]+>/gi) ); // <body>Cette regexp cherche le caractère
'<'suivi par une ou plusieurs lettres Latin, puis'>'. -
Amélioré:
/<[a-z][a-z0-9]*>/iConformément au standard, Le nom dâune balise HTML peut avoir un chiffre à nâimporte quel endroit à lâexception de la première position, comme
<h1>.alert( "<h1>Hi!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>
Regexp âbalise HTML dâouverture ou de fermeture sans attributsâ: /<\/?[a-z][a-z0-9]*>/i
Nous avons ajouté un slash optionnel /? près du début du pattern. Nous avons dû lâéchapper avec un backslash, sinon JavaScript aurait pensé que câétait la fin du pattern.
alert( "<h1>Hi!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
Vous pouvez voir une règle commune dans tous ces exemples: plus une expression régulière est précise â plus elle est longue et complexe.
Par exemple, pour des balises HTML nous pourrions utiliser une regexp plus simple: <\w+>. Mais comme HTML a des restrictions plus strictes pour les noms de balise, <[a-z][a-z0-9]*> est plus fiable.
Pouvons nous utiliser <\w+> ou avons nous besoin de <[a-z][a-z0-9]*>?
Dans la vrai vie les deux variantes sont acceptables. En fonction de la tolérance que nous avons vis-à -vis des sélections âen tropâ et la difficulté que lâon a de les retirer des résultats par dâautres moyens.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâ¦)