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.
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.(?<=\[).+?(?=\])
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:
(\[(?:\[??[^\[]*?\]))
Cela devrait fonctionner correctement:
\[([^]]+)\]
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.
(?<=\().*?(?=\))
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'"
Dans R, essayez:
x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
Si vous ne voulez pas inclure les crochets dans la correspondance, voici la regex: (?<=\[).*?(?=\])
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
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.
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.
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
([[][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 à +.
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"