515 votes

Expression régulière pour extraire le texte entre crochets

Question simple sur les regex. J'ai une chaîne au format suivant :

this is a [sample] string with [some] special words. [another one]

Quelle est l'expression régulière permettant d'extraire les mots entre crochets, c'est-à-dire

sample
some
another one

Remarque : dans mon cas d'utilisation, les parenthèses ne peuvent pas être imbriquées.

937voto

codaddict Points 154968

Vous pouvez utiliser la regex suivante à l'échelle mondiale :

\[(.*?)\]

Explication :

  • \[ : [ est un méta-caractère et doit être échappé si vous voulez le faire correspondre littéralement.
  • (.*?) : tout faire correspondre de manière non avide et le capturer.
  • \] : ] est un méta-caractère et doit être échappé si vous voulez le faire correspondre littéralement.

12 votes

La méthode de l'autre réponse, qui utilise [^]] est plus rapide que la méthode non avide ( ? ), et fonctionne également avec les saveurs de regex qui ne supportent pas la méthode non-greedy. Cependant, la version non-greedy est plus jolie.

221 votes

Comment exclure [ ] de sortie(résultat) ?

12 votes

@MickeyTin, si vous utilisez Java, vous pouvez les regrouper en utilisant group(1) plutôt que simplement group(), de sorte que les "[]" n'iront pas ensemble.

185voto

Adam Moszczyński Points 516
(?<=\[).+?(?=\])

Capture le contenu sans parenthèses

  • (?<=\[) - un regard positif sur l'avenir pour [

  • .*? - correspondance non gourmande pour le contenu

  • (?=\]) - anticipation positive pour ]

EDIT : pour les parenthèses imbriquées, la regex ci-dessous devrait fonctionner :

(\[(?:\[??[^\[]*?\]))

95voto

jasonbar Points 7212

Ça devrait marcher :

\[([^]]+)\]

5 votes

Dans mon cas d'utilisation, le texte entre crochets peut inclure de nouvelles lignes, et cette regex fonctionne, alors que la réponse acceptée ne fonctionne pas.

1 votes

Que signifie la classe de caractères [^]] ? À quoi correspond-elle ?

3 votes

@Richard, Le ^ annule la classe de caractères. Il signifie "tout caractère qui n'est pas un ]".

37voto

Tim Pietzcker Points 146308

Les parenthèses peuvent-elles être imbriquées ?

Si non : \[([^]]+)\] correspond à un élément, y compris les crochets. Référence arrière \1 contiendra l'élément à faire correspondre. Si votre version de la regex supporte le lookaround, utilisez

(?<=\[)[^]]+(?=\])

Cela ne correspondra qu'à l'élément entre parenthèses.

1 votes

@KunalMukherjee : Non, l'expression rationnelle peut correspondre à n'importe quel nombre de fois. Mais certaines saveurs de regex ont besoin d'être indiquées explicitement pour appliquer la regex de manière répétée (par exemple, en utilisant l'attribut /g en JavaScript).

22voto

LJ Germain Points 329

Si vous ne voulez pas inclure les parenthèses dans la correspondance, voici la regex : (?<=\[).*?(?=\])

Détaillons-le

El . correspond à n'importe quel caractère, à l'exception des terminaisons de ligne. Le site ?= est un perspective positive . Un lookahead positif trouve une chaîne lorsqu'une certaine chaîne vient après elle. Le site ?<= est un regard positif en arrière . Un lookbehind positif trouve une chaîne lorsqu'une certaine chaîne la précède. Pour citer ce ,

Regarder vers l'avenir de manière positive (?=)

Trouvez l'expression A où l'expression B suit :

A(?=B)

Regardez derrière le positif (?<=)

Trouver l'expression A où l'expression B précède :

(?<=B)A

L'alternative

Si votre moteur de regex ne supporte pas les lookaheads et les lookbehinds, vous pouvez utiliser la regex \[(.*?)\] pour capturer les entrailles des parenthèses d'un groupe, puis vous pouvez manipuler le groupe si nécessaire.

Comment fonctionne cette regex ?

Les parenthèses permettent de saisir les caractères d'un groupe. Le site .*? récupère tous les caractères entre les parenthèses (à l'exception des terminaisons de ligne, sauf si vous avez l'option s activé) d'une manière qui n'est pas gourmande.

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