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.

18voto

Wiktor Stribiżew Points 100073

Pour faire correspondre une sous-chaîne entre les premièrement [ y dernier ] vous pouvez utiliser

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

Voir un Démonstration de regex et un Démonstration de regex #2 .

Utilisez les expressions suivantes pour faire correspondre des chaînes de caractères entre les le plus proche crochets :

  • Y compris les supports :

  • \[[^][]*] - PCRE, Python re / regex .NET, Golang, POSIX (grep, sed, bash)

  • \[[^\][]*] - ECMAScript (JavaScript, C++ std::regex VBA RegExp )

  • \[[^\]\[]*] - Java, ICU regex

  • \[[^\]\[]*\] - Onigmo (Ruby, nécessite l'échappement des parenthèses partout)

  • Sans les parenthèses :

  • (?<=\[)[^][]*(?=]) - PCRE, Python re / regex .NET (C#, etc.), JGSoft Software

  • \[([^][]*)] - Bash , Golang - capture le contenu entre les crochets avec une paire de parenthèses non scapées, voir aussi ci-dessous

  • \[([^\][]*)] - JavaScript , C++ std::regex , VBA RegExp

  • (?<=\[)[^\]\[]*(?=]) - Regex Java, ICU (R stringr )

  • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, nécessite l'échappement des parenthèses partout)

NOTE : * correspond à 0 ou plusieurs caractères, utilisez + pour correspondre à 1 ou plus afin d'éviter les correspondances de chaînes vides dans la liste/le tableau résultant.

Lorsque les deux supports d'observation sont disponibles, les solutions ci-dessus s'appuient sur eux pour exclure la parenthèse ouverte/fermée avant/après. Sinon, il faut se fier aux groupes de capture (des liens vers les solutions les plus courantes dans certaines langues ont été fournis).

Si vous devez faire correspondre parenthèses imbriquées vous pouvez voir les solutions dans la section Expression régulière pour correspondre aux parenthèses équilibrées et remplacez les crochets ronds par les crochets carrés pour obtenir la fonctionnalité nécessaire. Vous devez utiliser des groupes de capture pour accéder au contenu, à l'exclusion des crochets d'ouverture/fermeture :

13voto

devd Points 143

(?<=\[).*?(?=\]) fonctionne bien selon l'explication donnée ci-dessus. Voici un exemple en 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'"

12voto

Emma Points 1

Juste au cas où, vous auriez pu avoir supports déséquilibrés vous pouvez probablement concevoir une expression avec récurrence similaire à celle-ci,

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

ce qui, bien sûr, dépend du langage ou du moteur RegEx que vous utilisez.

Démo RegEx 1


A part ça,

\[([^\]\[\r\n]*)\]

Démo RegEx 2

ou,

(?<=\[)[^\]\[\r\n]*(?=\])

Démo RegEx 3

sont de bonnes options à explorer.


Si vous souhaitez simplifier/modifier/explorer l'expression, elle a été expliquée dans le panneau supérieur droit de la page regex101.com . Si vous le souhaitez, vous pouvez également regarder en ce lien comment il se comporterait par rapport à certains échantillons.


Circuit RegEx

jex.im visualise les expressions régulières :

enter image description here

Test

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Source :

Expression régulière pour correspondre aux parenthèses équilibrées

8voto

La réponse de @Tim Pietzcker aquí

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

est presque celle que je cherchais. Mais il y a un problème : certains anciens navigateurs peuvent échouer sur le lookbehind positif. J'ai donc dû faire ma journée tout seul :). J'ai réussi à écrire ceci :

/([^[]+(?=]))/g

Peut-être que ça aidera quelqu'un.

console.log("this is a [sample] string with [some] special words. [another one]".match(/([^[]+(?=]))/g));

4voto

Nezar Fadle Points 1019

Ce code va extraire le contenu entre les crochets et les 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

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