337 votes

Expression régulière correspondant externe crochets

J'ai besoin d'une expression régulière pour sélectionner tout le texte entre les deux à l'extérieur des parenthèses.

Exemple: some text(text here(possible text)text(possible text(more text)))end text

Résultat: (text here(possible text)text(possible text(more text)))

J'ai essayé pendant des heures, vous l'esprit de mon expression régulière de la connaissance n'est pas ce que je voudrais être :-) de sorte que toute aide sera la bienvenue.

155voto

Frank Points 16055

Les expressions régulières ne sont pas le bon outil pour le travail parce que vous avez affaire avec des structures imbriquées, c'est à dire la récursivité.

Mais il existe un algorithme simple pour ce faire, que j'ai décrite dans cette réponse à une question précédente.

134voto

rogal111 Points 2672

Vous pouvez utiliser la regex de la récursivité:

\(([^()]|(?R))*\)

33voto

Zach Scrivena Points 15052
[^\(]*(\(.*\))[^\)]*

[^\(]* correspond à tout ce qui n'est pas une parenthèse ouvrante au début de la chaîne, (\(.*\)) capture requis sous-chaîne de caractères entre crochets, [^\)]* correspond à tout ce qui n'est pas une parenthèse fermante à la fin de la chaîne. Notez que cette expression ne tente pas de match entre parenthèses; un simple analyseur (voir dehmann réponse) serait plus adapté pour cela.

19voto

Tomalak Points 150423
(?<=\().*(?=\))

Si vous voulez sélectionner le texte entre deux correspondants parenthèses, vous êtes hors de la chance avec des expressions régulières. Cela est impossible.

Cette expression retourne le texte entre la première et la dernière fermeture de parenthèses dans votre chaîne.

13voto

Alexander Bartosh Points 2299

Il est effectivement possible de le faire à l'aide .net des expressions régulières. Mais il n'est pas trivial, donc de les lire attentivement.

Vous pouvez lire un bon article ici Vous aurez également besoin de lire sur les .net des expressions régulières. Vous pouvez commencer à lire ici

Les crochets <> ont été utilisés parce qu'ils ne nécessitent pas de s'échapper. Expression régulière ressemble à ceci:

        <
        [^<>]*
        (
                    (
                                (?<Open><)
                                [^<>]*
                    )+
                    (
                                (?<Close-Open>>)
                                [^<>]*
                    )+
        )*
        (?(Open)(?!))
        > 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X