Question regex simple. 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 pour extraire les mots entre crochets, c.-à-d.
sample
some
another one
Remarque: Dans mon cas d'utilisation, les crochets ne peuvent pas être imbriqués.
[^]]
est plus rapide que non-gourmand (?
), et fonctionne également avec des saveurs regex qui ne prennent pas en charge les non-gourmands. Cependant, les non gourmands sont plus beaux.[
]
de la sortie (résultat)?Capture le contenu sans crochets
(?<=\[)
- lookbehind positif pour[
.*?
- match non gourmand pour le contenu(?=\])
- anticipation positive pour]
EDIT: pour les crochets imbriqués, l'expression régulière ci-dessous devrait fonctionner:
la source
.
dedans ...Cela devrait fonctionner correctement:
la source
\[([^\[\]]*)\]
pour obtenir le contenu dans le support le plus interne. Si vous regardez danslfjlksd [ded[ee]22]
alors\[([^]]+)\]
vous obtiendrez[ded[ee]
alors l'expression proposée reviendrait[ee]
. testé dans le lienLes supports peuvent-ils être imbriqués?
Sinon:
\[([^]]+)\]
correspond à un élément, y compris les crochets. La référence arrière\1
contiendra l'élément à faire correspondre. Si votre saveur regex prend en charge le lookaround, utilisezCela ne correspondra qu'à l'élément entre parenthèses.
la source
/g
indicateur en JavaScript).Si vous ne souhaitez pas inclure les parenthèses dans la correspondance, voici l'expression régulière:
(?<=\[).*?(?=\])
Décomposons-le
Le
.
correspond à n'importe quel caractère à l'exception des terminateurs de ligne. Le?=
est une anticipation positive . Un lookahead positif trouve une chaîne quand une certaine chaîne vient après. C'est?<=
un regard positif derrière . Un lookbehind positif trouve une chaîne lorsqu'une certaine chaîne la précède. Pour citer ceci ,L'alternative
Si votre moteur regex ne prend pas en charge les lookaheads et lookbehinds, vous pouvez utiliser l'expression régulière
\[(.*?)\]
pour capturer les entrailles des crochets dans un groupe, puis vous pouvez manipuler le groupe si nécessaire.Comment fonctionne cette expression régulière?
Les parenthèses capturent les personnages d'un groupe. Le
.*?
obtient tous les caractères entre les crochets (sauf pour les terminateurs de ligne, sauf si les
drapeau est activé) d'une manière qui n'est pas gourmande.la source
(?<=\[).*?(?=\])
fonctionne bien selon l'explication donnée ci-dessus. Voici un exemple Python:la source
[]
), pas les parenthèses.Juste au cas où vous auriez pu avoir des parenthèses déséquilibrées , vous pouvez probablement concevoir une expression avec une récursion similaire à,
ce qui, bien sûr, serait lié à la langue ou au moteur RegEx que vous pourriez utiliser.
RegEx Demo 1
Autre que ça,
RegEx Demo 2
ou,
RegEx Demo 3
sont de bonnes options à explorer.
Si vous souhaitez simplifier / modifier / explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment cela se comparerait à certains exemples d'entrées.
Circuit RegEx
jex.im visualise les expressions régulières:
Tester
La source
Expression régulière pour correspondre à des parenthèses équilibrées
la source
si vous voulez seulement une petite lettre de l'alphabet entre crochets az
si vous voulez des lettres minuscules et majuscules a-zA-Z
si vous voulez des petites majuscules et une lettre numérique a-zA-Z0-9
si vous voulez tout entre crochets
si vous voulez du texte, des chiffres et des symboles
la source
Ci-dessus devrait fonctionner compte tenu de l'explication suivante
les caractères entre crochets [] définit la classe characte, ce qui signifie que le modèle doit correspondre au moins à un caractère mentionné entre crochets
\ s spécifie un espace
+ signifie au moins un des caractères mentionnés précédemment pour +.
la source
A-Z
ajouter au motif([[][a-zA-Z \s]+[]])
:; Je pense que c'est une bonne façon, alors que\
dans les modèles regex qui définissent les marques de chaîne ("et ') et mélangent les débutants en gérant la barre oblique inverse dans les utilisations" ou "!std::regex pattern{R"(["][a-zA-Z \s]+["])"};
Ce code extraira le contenu entre crochets et parenthèses
la source
Dans R, essayez:
la source
gsub(pat, "\\1", x, perl=TRUE)
, oùpat
est l'expression régulière que vous avez fournie ..Pour faire correspondre une sous -
[
]
chaîne entre la première et la dernière , vous pouvez utiliserVoir une démo regex et une démo regex # 2 .
Utilisez les expressions suivantes pour faire correspondre les chaînes entre les crochets les plus proches :
Y compris les supports:
\[[^][]*]
- PCRE, Pythonre
/regex
, .NET, Golang, POSIX (grep, sed, bash)\[[^\][]*]
- ECMAScript (JavaScript, C ++std::regex
, VBARegExp
)\[[^\]\[]*]
- Java regex\[[^\]\[]*\]
- Onigmo (Ruby, nécessite l'échappement des supports partout)À l'exclusion des parenthèses:
(?<=\[)[^][]*(?=])
- PCRE, Pythonre
/regex
, .NET (C #, etc.), ICU (Rstringr
), logiciel JGSoft\[([^][]*)]
- Bash , Golang - capturez le contenu entre crochets avec une paire de parenthèses non échappées, voir aussi ci-dessous\[([^\][]*)]
- JavaScript , C ++std::regex
, VBARegExp
(?<=\[)[^\]\[]*(?=])
- Java regex(?<=\[)[^\]\[]*(?=\])
- Onigmo (Ruby, nécessite l'échappement des supports partout)REMARQUE :
*
correspond à 0 ou plusieurs caractères, utilisez+
pour correspondre à 1 ou plus pour éviter les correspondances de chaînes vides dans la liste / le tableau résultant.Chaque fois que la prise en charge des deux contournements est disponible, les solutions ci-dessus s'appuient sur elles pour exclure le crochet d'ouverture / fermeture avant / arrière. Sinon, comptez sur la capture de groupes (des liens vers les solutions les plus courantes dans certaines langues ont été fournis).
Si vous devez faire correspondre des parenthèses imbriquées , vous pouvez voir les solutions dans l' expression régulière pour faire correspondre le thread entre parenthèses équilibrées et remplacer les crochets ronds par les carrés pour obtenir les fonctionnalités nécessaires. Vous devez utiliser des groupes de capture pour accéder au contenu avec le crochet ouvert / fermé exclu:
\[((?:[^][]++|(?R))*)]
- PHP PCRE\[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]
- Démonstration .NET\[(?:[^\]\[]++|(\g<0>))*\]
- Démo Onigmo (Ruby)la source
J'avais besoin d'inclure des nouvelles lignes et d'inclure les crochets
\[[\s\S]+\]
la source