web-dev-qa-db-fra.com

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

Question de regex simple. J'ai une chaîne sur le format suivant:

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

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

sample
some
another one

Remarque: Dans mon cas d'utilisation, les crochets ne peuvent pas être imbriqués.

343
ObiWanKenobi

Vous pouvez utiliser l'expression régulière suivante globalement:

\[(.*?)\]

Explication:

  • \[: [ est un méta-caractère et doit être échappé si vous souhaitez le faire correspondre littéralement.
  • (.*?): correspond à tout et capture-le.
  • \]: ] est un méta-caractère et doit être échappé si vous souhaitez le faire correspondre littéralement.
648
codaddict
(?<=\[).+?(?=\])

Va capturer le contenu sans crochets

  • (?<=\[) - recherche positive pour [

  • .*? - correspondance non gourmande pour le contenu

  • (?=\]) - résultat positif pour ]

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

(\[(?:\[??[^\[]*?\]))
85
Adam Moszczyński

Cela devrait fonctionner correctement:

\[([^]]+)\]
83
jasonbar

Les crochets peuvent-ils être imbriqués?

Si ce n'est pas le cas: \[([^]]+)\] correspond à un élément, y compris les crochets. La référence arrière \1 contiendra l'élément à faire correspondre. Si votre style regex prend en charge le lookaround, utilisez

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

Cela correspond uniquement à l'élément entre parenthèses.

32
Tim Pietzcker

(?<=\().*?(?=\)) fonctionne bien selon l'explication donnée ci-dessus. Voici un exemple Python:

import re 
str =    "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\().*?(?=\))', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"
9
devd

Dans R, essayez:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
3
Tony Ladson

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

Décomposons

Le . correspond à n'importe quel caractère, à l'exception des fins de ligne. Le ?= est un signe positif . Un regard positif recherche une chaîne lorsqu'une certaine chaîne vient après elle. Le ?<= est un aspect positif . Une recherche positive trouve une chaîne lorsqu'une certaine chaîne la précède. Pour citer this ,

Regard sur l'avenir positif (? =)

Recherchez l'expression A, où l'expression B suit:

A(?=B)

Regarder derrière positif (? <=)

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

(?<=B)A

L'alternative

Si votre moteur regex ne prend pas en charge l'apparence et l'apparence, vous pouvez utiliser l'expression regex \[(.*?)\] pour capturer les entrailles des crochets d'un groupe, puis vous pouvez manipuler le groupe si nécessaire.

Comment fonctionne cette expression rationnelle?

Les parenthèses capturent les caractères d'un groupe. Le .*? obtient tous les caractères entre les crochets (sauf les fins de ligne, sauf si le drapeau s est activé) de manière non gloutonne.

3
LJ Germain

Ce code va extraire le contenu entre crochets et parenthèses

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))

(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets
3
Nezar Fadle
([[][a-z \s]+[]])

Ci-dessus devrait fonctionner compte tenu de l'explication suivante

  • les caractères entre crochets [] définissent la classe de caractère, ce qui signifie que le motif doit correspondre à au moins un caractère mentionné entre crochets

  • \ s spécifie un espace

  • + signifie au moins l'un des caractères mentionnés précédemment à +.

3
spooks

Voici comment cela peut être fait avec JS:

"this is a [sample] string with [some] special words. [another one]".replace(/\[(.*?)\]/gi, "$1")

Cela produit la chaîne suivante:

"this is a sample string with some special words. another one"
0
Timur Gilauri