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âŠ)