Je veux faire correspondre une expression régulière sur un mot entier.
Dans l'exemple suivant, j'essaie de faire correspondre s
ou season
mais ce que j'ai correspond à s
, e
, a
, o
et n
.
[s|season]
Comment créer une expression régulière pour faire correspondre un mot entier?
Les crochets sont destinés à la classe de caractères et vous essayez réellement de faire correspondre l’un des éléments suivants: s
, |
, s
(encore une fois), e
, a
, s
(encore), o
et n
.
Utilisez plutôt des parenthèses pour regrouper:
(s|season)
ou groupe non capturant:
(?:s|season)
Remarque: Les groupes sans capture indiquent au moteur qu'il n'a pas besoin de stocker la correspondance, alors que l'autre groupe (le groupe de capture le fait). Pour les petites choses, soit ça marche, pour les choses "lourdes", vous voudrez peut-être voir d’abord si vous avez besoin de l’allumette ou non. Si vous ne le faites pas, mieux vaut utiliser le groupe de non-capture pour allouer plus de mémoire pour le calcul au lieu de stocker quelque chose que vous n’aurez jamais besoin d’utiliser.
Ci-dessus, capture d'écran prise de cet exemple en direct: https://regex101.com/r/cU5lC2/1
J'utiliserai le phpsh interactive Shell sur buntu 12.1 pour démontrer le moteur de regex PCRE par la méthode connue sous le nom preg_match
Lancez phpsh, mettez du contenu dans une variable, faites une correspondance sur Word.
el@apollo:~/foo$ phpsh
php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'
php> echo preg_match('(\w+)', $content1);
1
php> echo preg_match('(\w+)', $content2);
1
php> echo preg_match('(\w+)', $content3);
0
La méthode preg_match a utilisé le moteur PCRE du langage PHP pour analyser les variables: $content1
, $content2
et $content3
avec le modèle (\w)+
.
$ content1 et $ content2 contiennent au moins un mot, pas $ content3.
el@apollo:~/foo$ phpsh
php> $gun1 = 'Dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'Unicorn gun';
php> echo preg_match('(Dart|fart)', $gun1);
1
php> echo preg_match('(Dart|fart)', $gun2);
1
php> echo preg_match('(Dart|fart)', $gun3);
1
php> echo preg_match('(Dart|fart)', $gun4);
0
Les variables gun1
et gun2
contiennent la chaîne Dart
ou fart
qui est correcte, mais gun3 contient darty
et correspond toujours, tel est le problème. Donc, sur le prochain exemple.
Les limites de Word peuvent être forcées avec \b
, voir:
Image visuelle Regex acquise de http://jex.im/regulex et https://github.com/JexCheng/regulex Exemple:
el@apollo:~/foo$ phpsh
php> $gun1 = 'Dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'Unicorn gun';
php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0
php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0
Le \b
affirme que nous avons une limite de Word, en s'assurant que "Dart" correspond, mais pas "darty".
Je teste des exemples en js. La solution la plus simple - il suffit d'ajouter Word que vous avez besoin dans//:
var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result
Maintenant, si vous avez besoin de ce mot spécifique avec des limites, pas à l’intérieur d’autres signes-lettres. Nous utilisons le marqueur b:
var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result
Nous avons également la méthode exec () en js, laquelle renvoie le résultat de l'objet. Cela aide par exemple pour obtenir des informations sur le lieu/index de notre mot.
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
Si nous devons obtenir tous les mots correspondants dans chaîne/phrase/texte, nous pouvons utiliser le modificateur g (correspondance globale):
"cat good cat good cat".match(/\bcat\b/g).length
// 3
Maintenant, le dernier - je n’ai pas besoin d’un mot spécifique, mais de quelques-uns. Nous utilisons | signe, cela signifie choix/ou.
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]
définit une classe de caractères. Ainsi, chaque personnage que vous définissez ici correspondra. [012]
correspondra à 0
ou 1
ou 2
et [0-2]
se comportera de la même manière.
Ce que vous voulez, c'est que les groupements définissent une instruction or. Utilisez (s|season)
pour votre problème.
Btw. vous devez faire attention. Les métacaractères dans une expression rationnelle normale (ou à l'intérieur d'un groupe) sont différents de la classe de caractères. Une classe de caractères est comme une sous-langue. [$A]
ne fera correspondre que $
ou A
, rien d'autre. Pas d'échapper ici pour le dollar.