Regex: faire correspondre des groupes dans un ordre différent sans répéter le groupe
Disons que j'ai deux chaînes de caractères comme ceci:
XABY
XBAY
Une simple expression régulière qui correspond à la fois irait comme ceci:
X(AB|BA)Y
Cependant, j'ai un cas où A et B sont des complexes de chaînes, et je suis à la recherche d'un moyen pour éviter d'avoir à spécifier chacun d'entre eux à deux reprises (de chaque côté de la |). Est-il un moyen de le faire (c'est sans doute plus simple que d'avoir à les spécifier deux fois)?
Grâce
source d'informationauteur Jimmy
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous utilisez un vide capture d'un groupe de cocher chaque élément quand il est en correspondance, puis l'arrière-références s'assurer que tout est coché.
Être conscient que cela repose sur les sans-papiers regex comportement, donc il n'y a aucune garantie que cela fonctionnera dans votre regex saveur--et si elle le fait, il n'y a aucune garantie qu'il sera continuer à travailler en tant que saveur évolue. Mais autant que je sache, il fonctionne dans toutes les saveurs qui prend en charge des références arrières. (EDIT: Ça ne fonctionne pas en JavaScript.)
EDIT: vous dites que Vous êtes en utilisant des groupes nommés pour capturer des parties du match, ce qui ajoute beaucoup de encombrement visuel pour la regex, si ce n'est réelle complexité. Eh bien, si vous arrive d'être en utilisant .NET regexes, vous pouvez toujours utiliser de simples numérotés de groupes pour les "cases à cocher". Voici un exemple simpliste qui trouve et prend à part un tas de mois-jour des chaînes sans connaître leur ordre interne:
Cela fonctionne parce que dans .NET, la présence de groupes nommés n'a pas d'effet sur l'ordre de la non-nommé groupes. Les groupes nommés ont des numéros qui leur sont assignées, mais ces numéros commencent après le dernier de la non-nommé groupes. (Je sais que cela semble inutilement compliqué, mais il y a de bonnes raisons pour le faire de cette façon.)
Normalement, vous souhaitez éviter d'utiliser nommé et non-nommé de capturer les groupes ensemble, surtout si vous utilisez des références arrières, mais je pense que cette affaire pourrait être un légitime exception.
Vous pouvez stocker des regex pièces dans des variables, et à faire:
De cette façon, vous n'avez qu'à spécifier pour chacune des regex une fois, sur sa propre ligne, qui devrait rendre plus facile à maintenir.
Note: Vous essayez de trouver des permutations, ce qui est normal puisque vous êtes seulement à la recherche, à 2 subregexes. Mais si vous voulez ajouter un troisième (ou quatrième), votre regex permutations croître de façon drastique - (abc|pbr|bac|bca|cab|abc) - ou pour le pire. Si vous avez besoin d'aller en bas de la route de permutations, il y a une bonne discussion à ce sujet ici sur stackoverflow. C'est pour la lettre de permutation, et les solutions utiliser awk/bash/perl, mais au moins vous donne un point de départ.
essayer cette
Si il y a plusieurs chaînes, avec toutes sortes de caractères, tu sera mieux avec:
Uniquement des nombres puis
Uniquement des lettres
Lettres et de chiffres