2015-10-31 1 views
2

En Perl, vous pouvez le faire:Sous-routines nommées dans le moteur Ongegie Regex?

(?x) 
(?(DEFINE) 
    (?<animal>dog|cat) 
) 
(?&animal) 

Dans Ruby (moteur Oniguruma), il semble que la syntaxe (?(DEFINE... n'est pas pris en charge. En outre, (?&... devient \g. Ainsi, vous pouvez le faire:

(?x) 
(?<animal>dog|cat) 
\g<animal> 

Mais bien sûr, ce n'est pas équivalent à l'exemple Perl j'ai donné ci-dessus, becuase la première (?<animal>dog|cat) n'est pas ignorée, car il n'y a rien comme (?(DEFINE....

Si je veux définir une regex de grande taille avec un tas de sous-programmes nommés, ce que je pourrais faire une fois dans Perl ne peut pas être fait de cette façon.

Il ne semble que je pourrais pirater ensemble une solution assez maladroite en faisant quelque chose comme ceci:

(?x) 
(?:^$DEFINE 
    (?<animal>dog|cat) 
){0} 
\g<animal> 

Mais, qui est assez hackish. Y a-t-il une meilleure manière de faire cela? Oniguruma supporte-t-il un moyen de définir des sous-programmes nommés sans avoir à essayer de les "apparier" en premier?

Sinon, s'il existe un moyen de faire fonctionner PCRE dans Ruby, avec ?(DEFINE... et (?&..., je prendrais cela aussi.

Merci!

Répondre

4

Vous n'avez pas besoin d'un hack si compliqué. Écriture:

(?x) 
(?<animal>dog|cat){0} 
(?<color>red|green|blue){0} 
... 
your main pattern here 

fait exactement la même chose.

Mettre toutes les définitions de groupe à l'intérieur (?:^$DEFINE ...){0} est seulement cosmétique.

Notez qu'un groupe avec le quantificateur {0} n'est pas "essayé" du tout (le quantificateur est lu en premier). Et si de cette façon le groupe nommé est défini de toute façon, l'homme peut déduire que ce n'est pas vraiment un hack, mais la façon de le faire avec oniguruma.

+1

Bonne réponse, mais j'ajouterais que la forme "cosmétique" devrait être simplement '(?: ...) {0}'. La partie '^ $ DEFINE' ne sert à rien, et si la variable' $ DEFINE' a été définie, sa valeur pourrait être quelque chose qui va casser l'expression rationnelle. Comme vous l'avez dit, le '{0}' fournit la fonctionnalité essentielle; le regroupement est juste une commodité. –