Question

Je suis désireux de faire correspondre une liste de mots qui est assez facile quand ces mots sont vraiment des mots. Par exemple /\b (pop|push) \b/gsx lorsqu'il est lancé contre la chaîne

  

pop a la porte un coup de pouce, mais il est réapparu

correspondent aux mots pop et pousser mais pas sauté.

J'ai besoin des fonctionnalités similaires pour les mots qui contiennent des caractères qui sont habituellement formés comme des limites de mots. Donc, j'ai besoin /\b (reverse!|push) \b/gsx quand couru contre la chaîne

  

bouton marche arrière! inverse! appuyez sur

pour seul match inverse! et pousser mais ne pas correspondre à l'envers! pousser. Il est évident que cette expression régulière ne va pas le faire alors que dois-je utiliser au lieu de \ b pour faire mon regex assez intelligent pour gérer ces exigences géniales?

Était-ce utile?

La solution

A la fin d'un mot, \ b signifie « le caractère précédent était un caractère de mot, et le caractère suivant (s'il y a un caractère suivant) n'est pas un caractère de mot. Vous voulez laisser tomber la première condition, car il pourrait y avoir un caractère non-mot à la fin du « mot » Cela vous laisse avec un négatif préanalyse:.

/\b (reverse!|push) (?!\w)/gx

Je suis assez sûr regexes AS3 soutien préanalyse.

Autres conseils

Votre premier problème est que vous avez besoin de trois (voire quatre) cas dans votre alternance, pas deux.

  • /\breverse!(?:\s|$)/ inverse! par lui-même
  • push /\bpush\b/ par lui-même
  • /\breverse!push\b/ ensemble
  • /\bpushreverse!(?:\s|$)/ c'est le cas possible

Votre deuxième problème est qu'un \b ne correspondra pas à la suite d'un "!" parce qu'il est pas un \w. Voici ce que Perl 5 a à dire au sujet de \b , vous pouvez consulter vos documents pour voir s'ils sont d'accord:

  

est un spot entre deux caractères qui a un « \ w » sur un côté de celui-ci et un « \ W » de l'autre côté de celui-ci (dans un ordre quelconque) une limite de mot ( « \ b »), en comptant le personnages imaginaires hors le début et la fin de la chaîne de caractères comme correspondant à un « \ W ». (Dans les classes de caractères « \ b » représente backspace plutôt qu'une limite de mot, comme il le fait normalement dans une chaîne entre guillemets.)

Alors, l'expression rationnelle que vous avez besoin est quelque chose comme

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

J'ai quitté le /s parce qu'il n'y a pas de périodes dans cette regex, donc traiter comme seule ligne n'a pas de sens. Si /s ne signifie pas traiter comme une seule ligne dans votre moteur, vous devriez probablement ajouter de nouveau. En outre, vous devriez lire sur comment votre moteur alternance. Je sais en Perl 5 pour obtenir le bon comportement, vous devez disposer les éléments de cette façon (autrement inverse! Serait toujours gagner inverse! Pousser).

Vous pouvez remplacer \ b par quelque chose d'équivalent, mais moins stricte:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

De cette façon, le facteur limitant de la \b (qu'il ne peut correspondre avant ou après un caractère \w réelle de mot) est supprimé.

espace blanc ou le début / fin de la fonction de chaîne comme des séparateurs valides, et l'expression intérieure peuvent être facilement construits à l'exécution, à partir d'une liste de termes de recherche, par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top