147 votes

Expression régulière permettant de faire correspondre un mot ou son préfixe

Je veux faire correspondre une expression régulière sur un mot entier.

Dans l'exemple suivant, j'essaie de faire correspondre s o season mais ce que j'ai correspond s , e , a , o y n .

[s|season]

Comment faire en sorte qu'une expression régulière corresponde à un mot entier ?

175voto

Jerry Points 40870

Les crochets sont destinés aux classes de caractères, et vous essayez en fait de faire correspondre n'importe lequel d'entre eux : s , | , s (encore), e , a , s (encore), o y n .

Utilisez plutôt les parenthèses pour le regroupement :

(s|season)

ou un groupe de non-capture :

(?:s|season)

Note : Les groupes non capturables indiquent au moteur qu'il n'a pas besoin de stocker la correspondance, alors que l'autre (groupe capturable) le fait. Pour les petites choses, l'un ou l'autre fonctionne, pour les choses plus importantes, vous voudrez peut-être voir d'abord si vous avez besoin de la correspondance ou non. Si ce n'est pas le cas, il vaut mieux 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.

160voto

Eric Leschinski Points 14289

Utilisez cet exemple en ligne pour tester votre modèle :

enter image description here

La capture d'écran ci-dessus est tirée de cet exemple en direct : https://regex101.com/r/cU5lC2/1

Correspondance de tout mot entier sur la ligne de commande.

Je vais utiliser le phpsh interactive shell en Ubuntu 12.10 pour démontrer la Moteur de regex PCRE par la méthode connue sous le nom de preg_match

Lancez phpsh, mettez du contenu dans une variable, faites correspondre les mots.

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 utilise le moteur PCRE du langage PHP pour analyser les variables : $content1 , $content2 y $content3 avec le (\w)+ modèle.

$content1 et $content2 contiennent au moins un mot, $content3 n'en contient pas.

Faire correspondre un mot spécifique sur la ligne de commande sans les primes de mots

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

Variables gun1 y gun2 contiennent la chaîne de caractères dart o fart ce qui est correct, mais le pistolet3 contient darty et correspond toujours, c'est ça le problème. Passons donc à l'exemple suivant.

Faites correspondre des mots spécifiques de la ligne de commande avec des frontières de mots :

Word Boundaries peut être jumelé avec \b voir : Visual analysis of what wordboundary is doing from jex.im/regulex

Regex Visual Image acquise à partir de http://jex.im/regulex y 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 site \b affirme qu'il y a une frontière entre les mots, en s'assurant que " dart " est compatible, mais que " darty " ne l'est pas.

5voto

Vasyl Gutnyk Points 2481

Je teste des exemples en js. La solution la plus simple - il suffit d'ajouter le mot dont vous avez besoin à l'intérieur de / / :

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 b marqueur :

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

Nous avons aussi la méthode exec() en js, qui renvoie un résultat objet. Cela permet par exemple d'obtenir des informations sur la place/index de notre mot.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

Si nous voulons obtenir tous les mots correspondants dans la chaîne, la phrase ou le 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 plusieurs d'entre eux. Nous utilisons le signe |, il signifie choix/ou.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

2voto

[ ] définit une classe de caractères. Ainsi, chaque caractère que vous définissez ici correspondra. [012] correspondra à 0 o 1 o 2 y [0-2] se comporte de la même manière.

Ce que vous voulez, ce sont des regroupements pour définir un état ou. Utilisez (s|season) pour votre problème.

En fait, il faut faire attention. Les métacaractères dans une regex normale (ou dans un groupement) sont différents des classes de caractères. Une classe de caractères est comme un sous-langage. [$A] ne correspondra qu'à $ o A et rien d'autre. Pas d'échappatoire ici pour le dollar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X