Expression régulière pour correspondre à un mot ou à son préfixe

119

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

Dans l'exemple suivant , je suis en train de faire correspondre sou , seasonmais ce que j'ai matchs s, e, a, oet n.

[s|season]

Comment faire correspondre une expression régulière à un mot entier?

NMGod
la source
4
Utilisez (season|s)plutôt. [season]correspond à l' une s, e, a, o, n.
falsetru

Réponses:

137

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), oet 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.

Jerry
la source
Ouais je l'avais réalisé. La non-capture était ce dont j'avais besoin. Je pensais que l'utilisation de () correspondrait toujours, sachant qu'il existe une option pour ne pas correspondre, c'est pratique, merci.
NMGod
Vous avez mal compris cela. L' ?:intérieur d'un groupement dit non-capturingsimplement que vous ne pouvez pas utiliser les expressions correspondantes avec $1, $2et ainsi de suite ... Si vous voulez qu'une expression ne corresponde pas, ce dont vous avez besoin est ^.
EverythingRightPlace
@ NMGodA1b2c3d4 Vous êtes les bienvenus! Voulez-vous dire une option pour ne pas correspondre ou attraper (il y a une différence, oui). Si vous ne souhaitez faire correspondre aucun de ces éléments, vous utiliserez (?! ... )insead, c'est- (?!s|season)à- dire dans ce cas.
Jerry
126

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

entrez la description de l'image ici

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

Correspondant à n'importe quel mot entier sur la ligne de commande.

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, $content2et $content3avec le (\w)+motif.

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

Faites correspondre des mots spécifiques sur la ligne de commande sans 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

Les variables gun1et gun2contiennent la chaîne dartou fartqui est correcte, mais gun3 contient dartyet correspond toujours, c'est le problème. Donc, sur l'exemple suivant.

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

Les limites de mots peuvent être forcées \b, voir: Analyse visuelle de ce que fait Wordboundary à partir de jex.im/regulex

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' \baffirmation que nous avons une limite de mot, en s'assurant que "dart" correspond, mais "darty" ne l'est pas.

Eric Leschinski
la source
3
a voté parce que j'avais besoin du caractère \ b, et je ne le savais pas!
Nieminen
Pourquoi cette explication approfondie n'est-elle pas la réponse?
dewwwald
1
Parce que la personne qui a posté la question a choisi la première réponse qui est arrivée, et n'a pas pris la peine de passer à la mienne quand ma réponse largement supérieure est arrivée plus tard. Vous pouvez demander à l'interlocuteur via un commentaire sous la question de changer sa sélection de réponse pour celle-ci, et cela améliorerait la valeur de cette page pour les personnes qui y atterrissent.
Eric Leschinski
1
J'ai voté pour parce que vous avez utilisé le mot "pet" dans votre exemple ... et j'avais besoin du \ w +;)
SomethingOn
J'utilise regexr.com
Applez00800
4

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
Vasyl Gutnyk
la source
2

[ ]définit une classe de caractères. Ainsi, chaque caractère que vous définissez ici correspondra. [012]correspondra à 0ou 1ou 2et [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 Arien d'autre. Pas d'échappatoire ici pour le dollar.

EverythingRightPlace
la source