web-dev-qa-db-fra.com

Expression régulière pour 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 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?

103
NMGod

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.

123
Jerry

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

enter image description here

Ci-dessus, capture d'écran prise de cet exemple en direct: https://regex101.com/r/cU5lC2/1

Faire correspondre n'importe quel mot sur la ligne de commande.

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.

Correspondre à des mots spécifiques sur la ligne de commande sans les primes Word

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.

Faites correspondre des mots spécifiques sur la ligne de commande avec les limites de Word:

Les limites de Word peuvent être forcées avec \b, voir: Visual analysis of what wordboundary is doing from jex.im/regulex

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".

112
Eric Leschinski

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
3
Vasyl Gutnyk

[ ] 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.

2