Regex multiples correspondance de sous-chaîne
J'ai une application qui détermine, compte tenu d'une expression rationnelle perl, si il faut afficher un menu déroulant ou un simple champ de saisie. Donc, je dois vérifier que l'expression régulière pattern pour une "forme extérieure" et des sous-chaînes. Pour cela, j'ai trouvé plusieurs solutions.
Donné le modèle d'entrée "^(100/500/1000)$", ce qui devrait se traduire dans un menu déroulant avec trois entrées, 100, 500 et 1000. J'ai besoin d'une regex qui parcourt l'ensemble du motif, pour déterminer si c'est une liste valide, et une regex qui effectue la correspondance de sous-chaîne, car je ne sais pas comment faire correspondre une sous-chaîne à plusieurs reprises. C'est mon expression régulière pattern:
^\^\((?:((?:[^\|]|\\\|)+)(?:\||(?:\)$$)))+
Un peu de simplification, puisque cette expression est un peu floue:
^\^\((?:([\w\d]+)(?:\||(?:\)$$)))+
Cela fonctionne, mais seulement les magasins de la dernière sous-chaîne (1000 dans le cas d'espèce) et jette le reste à l'écart, testé avec soit PCRE et en ligne regex outils. Pour obtenir le véritable sous-chaînes, c'est à dire le menu déroulant des champs, j'ai:
(?:\^\()?((?:[^\|]|\\|)+)(?:\||(?:\)$$))
Simplification de nouveau:
(?:\^\()?([\w\d]+)(?:\||(?:\)$$))
Correspond à la sous-chaîne, mais ne correspond pas au menu déroulant modèle de syntaxe qui l'autre regex n' (ce qui correspond à "^(100|" avec les sous-chaîne "100", par exemple).
Ma question est: est-il un moyen de combiner ces expressions régulières pour avoir juste un modèle qui correspond à 1) le modèle de la syntaxe et 2) la sous-chaînes?
Merci d'avance,
Jeremy
P. S.: désolé si c'est évident, mais je suis très peu embrouillé au sujet de toutes ces expressions régulières aujourd'hui.
Des données de l'échantillon:
Entrée regex: ^(100/500/1000)$
Syntax OK!
Appariés sous-chaînes: 100, 500, 1000
=> menu déroulant afficher
Entrée regex: ^[0-9a-fA-F]+$
La syntaxe est incorrecte!
=> show régulier champ de saisie
Entrée regex: ^(foo|bar)$
Syntax OK!
Appariés sous-chaînes: "foo", "bar"
=> menu déroulant afficher
Entrée regex: ^(foo|bar)[0-9]+$
La syntaxe est incorrecte!
=> show régulier champ de saisie
Merci pour votre aide! J'ai ajouté quelques données de l'échantillon.
J'ai mis à jour ma réponse avec les données que vous avez fournies
OriginalL'auteur Jeremy | 2014-08-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir ce dont vous avez besoin en utilisant deux étapes.
Vous pouvez utiliser cette expression pour valider le format:
Travail de démonstration
Une fois que vous avez validé le droit chaînes, vous pouvez utiliser une fonction comme ceci:
De sortie:
J'ai modifié vous regex "\^((\w+)(?:\|(\w+))*)\$". Cette capture deux groupes, les deux sont "\w+" et le dernier sera remplacé avec plus de 2 éléments (ce qui arrive pour la première chaîne de test).
Vous pouvez utiliser ma regex
\^((\w+)(?:\|(\w+))*)\$
en plus de Lucas de la réponse. En attendant, je vais de ceJe pense que vous devriez utiliser deux étapes. La première utilisation de ma regex pour valider le modèle, puis une fois que vous avez validé, vous pouvez utiliser
preg_split ("/\W+/", string $subject)
J'ai mis à jour ma réponse
OriginalL'auteur Federico Piazza
Dirait que vous êtes en utilisant PCRE.
Vous pouvez tirer parti de la
PCRE_DUPNAMES
option, ou bien mettre le(?J)
option à l'avant du modèle.Cette option permet de PCRE souvenir de tous les capturer de la valeur du groupe que les matchs, et non pas simplement jeter tout ce qui mais le dernier.(c'est faux, voir les commentaires)Malheureusement, il n'est pas pris en charge par les outils de test autant que je sache. Je ne connais pas le langage que vous utilisez, mais il a besoin d'un certain soutien de trop pour vous permettre d'utiliser cette fonctionnalité.
De la PCRE docs:
J'avoue que je suis un peu confus sur ce après avoir pris un coup d'oeil à la PCRE docs. J'ai supposé que c'est similaire .NET plusieurs captures, mais maintenant je ne suis plus trop sûr. S'il vous plaît laissez-moi savoir.
PCRE_DUPNAMES
vous permet d'attribuer le même nom à deux ou plus de deux groupes, même si ces groupes ont des nombres différents. Quand le match est fini, il y aura toujours une seule valeur associée à ce nom, de même qu'avec les numéros de groupe. PCRE ne propose pas encore un moyen de récupérer intermédiaire capture de la répétition des groupes comme .NET ne.J'ai essayé vos conseils, mais ils n'ont pas de travail - PCRE ne s'est toujours pas de retour de tous les matches, tout comme Alan a déclaré. Donc, je vais simplifier ma expressions régulières comme la Fede a suggéré.
J'ai clairement mal compris la doc à ce sujet. Trop mal, merci pour la clarification. Jeremy: désolé pour la réponse erronée et trompeuse.
OriginalL'auteur Lucas Trzesniewski