Comment puis-je faire correspondre plusieurs expressions régulières en Perl?
Je voudrais vérifier si une chaîne de caractères correspondant à un ensemble donné de regexes. Comment puis-je le faire?
source d'informationauteur David B
Vous devez vous connecter pour publier un commentaire.
Mon go-to pour le test d'une valeur à l'encontre de plusieurs regexes à la fois est Regexp::Assemblerqui va Assembler plusieurs Expressions Régulières en une seule RE" d'une manière un peu plus intelligente et optimisée que de simplement faire un
join '|', @regexps
. Vous êtes également en mesure, par défaut, pour récupérer la partie du texte correspondant et, si vous avez besoin de savoir quel modèle de correspondance, latrack
commutateur de fournir ces informations. Sa performance est assez bonne dans une application, je l'utilise pour tester l'encontre de 1700 modèles à la fois - et je n'ai pas encore besoin de quelque chose qu'il ne fait pas.Utiliser smart matching si vous avez la version en perl 5.10 ou plus récent!
Bien que vous ne voyez pas explicite
~~
opérateur, Perldonné
/quand
t-il derrière les coulisses:“Smartmatch Opérateur” in perlop donne un tableau de beaucoup de combinaisons que vous pouvez utiliser, et le code ci-dessus correspond au cas où
$a
est Tout et$b
est Tableauqui correspond à peu près àà l'exception de la recherche de courts-circuits, c'est à direse retourne rapidement sur un match plutôt que de traiter de tous les éléments. Dans la boucle implicite ensuite, nous sommes smart matching Tout contre Regexqui est
De sortie:
Additif
Depuis cette réponse a été écrit à l'origine, Perl, les designers ont réalisé qu'il y avait des erreurs dans la façon dont smartmatching œuvres, et il est donc maintenant considéré comme une fonctionnalité expérimentale. Le boîtier ci-dessus n'est pas l'un des controverses utilise, néanmoins, le code de sortie du comprendrait
given is experimental
etwhen is experimental
sauf que j'ai ajouténo warnings 'experimental::smartmatch';
.Toute utilisation de fonctions expérimentales implique certains risques, mais j'avais l'estimation basse de probabilité pour ce cas. Lors de l'utilisation d'un code similaire à ce qui précède et de la mise à niveau vers une version plus récente de Perl, c'est un potentiel de gotcha d'être conscient de.
De perlfaq6's réponse à Comment puis-je adapter efficacement le nombre d'expressions régulières à la fois?dans ce cas, la dernière version de développement que je viens de mettre à jour avec un smart match exemple.
Comment puis-je adapter efficacement le nombre d'expressions régulières à la fois?
(contribution de brian d foy)
Si vous avez Perl 5.10 ou plus tard, c'est presque banal. Vous avez juste à puce
match contre un tableau de l'expression régulière objets:
La smart match s'arrête lorsqu'il trouve une correspondance, il n'a pas à essayer
chaque expression.
Plus tôt que Perl 5.10, vous avez un peu de travail à faire. Vous voulez
éviter la compilation d'une expression régulière à chaque fois que vous voulez pour le match.
Dans cet exemple, perl devez recompiler l'expression régulière pour chaque
itération de la boucle C, car il n'a aucun moyen de savoir ce que
C:
Le C de l'opérateur a montré en perl 5.005. Il compile un régulier
l'expression, mais ne l'applique pas. Lorsque vous utilisez le pré-compilés
la version de la regex perl fait moins de travail. Dans cet exemple, j'ai inséré
un C pour faire de chaque motif dans son pré-forme compilée. Le reste de
le script est le même, mais plus rapide:
Dans certains cas, vous peut être capable de faire plusieurs modèles en un seul
expression régulière. Méfiez-vous des situations qui nécessitent un retour en arrière
si.
Pour plus de détails sur l'expression régulière de l'efficacité, de voir que je par Jeffrey Freidl. Il explique comment régulier
moteur d'expression et la raison pour laquelle certains modèles sont étonnamment
inefficaces. Une fois que vous comprenez comment perl utilise les expressions régulières,
vous pouvez régler dans toutes les situations.
Je ne suis pas exactement sûr de ce que vous recherchez, mais quelque chose comme ça?
Vous pouvez également compiler toutes ces données en un seul reges comme ceci:
Espère que ça aide.
Si vous utilisez un grand nombre d'expressions régulières, vous pourriez être intéressé par Regexp::Optimiseur De
Voir à partir de la synthèse de la section :
Qui pourrait être plus efficace, si vous êtes prêt à installer un module supplémentaire.