Réponses:
Les crochets sont destinés à la classe de caractères, et vous êtes en train d' essayer de faire correspondre l'une des: s
, |
, s
(encore une fois), e
, a
, s
(encore une fois), o
et n
.
Utilisez plutôt des parenthèses pour le regroupement:
(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, tandis que l'autre (le groupe de capture le fait). Pour les petits trucs, les travaux, pour les trucs «lourds», vous voudrez peut-être voir d'abord si vous avez besoin du match ou non. Si vous ne le faites pas, mieux vaut utiliser le groupe 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.
?:
intérieur d'un groupement dit non-capturing
simplement que vous ne pouvez pas utiliser les expressions correspondantes avec $1
, $2
et ainsi de suite ... Si vous voulez qu'une expression ne corresponde pas, ce dont vous avez besoin est ^
.
(?! ... )
insead, c'est- (?!s|season)
à- dire dans ce cas.
Capture d'écran ci-dessus tirée de cet exemple en direct: https://regex101.com/r/cU5lC2/1
J'utiliserai le shell interactif phpsh sur Ubuntu 12.10 pour démontrer le moteur regex PCRE via la méthode connue sous le nom de preg_match
Démarrez phpsh, mettez du contenu dans une variable, faites correspondre le mot.
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 de preg_match utilisé le moteur de PCRE dans le langage PHP pour analyser les variables: $content1
, $content2
et $content3
avec le (\w)+
motif.
$ content1 et $ content2 contiennent au moins un mot, $ content3 n'en contient pas.
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, c'est le problème. Donc, sur l'exemple suivant.
Les limites de mots peuvent être forcées \b
, voir:
Image visuelle Regex acquise à partir 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
L' \b
affirmation que nous avons une limite de mot, en s'assurant que "dart" correspond, mais "darty" ne l'est pas.
Je teste des exemples en js. Solution la plus simple - ajoutez simplement le mot dont vous avez besoin à l'intérieur / /:
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 () dans js, qui renvoie le résultat objet. Cela aide fg à obtenir des informations sur le lieu / l'index de notre mot.
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
Si nous avons besoin d'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 certains d'entre eux. 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 caractère 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, ce sont des regroupements pour définir une instruction or. Utilisez (s|season)
pour votre problème.
Btw. vous devez faire attention. Les métacaractères dans une expression régulière normale (ou à l'intérieur d'un groupement) sont différents de la classe de caractères. Une classe de caractères est comme un sous-langage. [$A]
ne correspondra qu'à $
ou A
rien d'autre. Pas d'échappatoire ici pour le dollar.
(season|s)
plutôt.[season]
correspond à l' unes
,e
,a
,o
,n
.