it-swarm.com.de

Regulärer Ausdruck zum Extrahieren von Text in eckigen Klammern

Einfache Regex-Frage. Ich habe eine Zeichenfolge im folgenden Format:

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

Was ist der reguläre Ausdruck, um die Wörter in eckigen Klammern zu extrahieren, dh.

sample
some
another one

Hinweis: In meinem Anwendungsfall können Klammern nicht verschachtelt werden.

343
ObiWanKenobi

Sie können den folgenden regulären Ausdruck global verwenden:

\[(.*?)\]

Erläuterung:

  • \[: [ ist ein Metazeichen und muss maskiert werden, wenn Sie buchstäblich übereinstimmen möchten.
  • (.*?): Kombiniere alles auf eine nicht gierige Art und Weise und fange es ein.
  • \]: ] ist ein Metazeichen und muss maskiert werden, wenn Sie buchstäblich übereinstimmen möchten.
648
codaddict
(?<=\[).+?(?=\])

Erfasst Inhalte ohne Klammern

  • (?<=\[) - positives Aussehen hinter [

  • .*? - Nicht gierige Übereinstimmung für den Inhalt

  • (?=\]) - positiver Ausblick auf ]

BEARBEITEN: für geschachtelte Klammern sollte der folgende reguläre Ausdruck funktionieren:

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

Das sollte klappen:

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

Können Klammern verschachtelt werden?

Wenn nicht: \[([^]]+)\] stimmt mit einem Element überein, einschließlich eckiger Klammern. Rückverweis \1 enthält das zu vergleichende Element. Wenn Ihre Regex-Variante Lookaround unterstützt, verwenden Sie

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

Dies passt nur zu dem Gegenstand in Klammern.

32
Tim Pietzcker

(?<=\().*?(?=\)) funktioniert wie oben beschrieben. Hier ist ein Python Beispiel:

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

Versuchen Sie in R:

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

Wenn Sie die Klammern nicht in das Match einschließen möchten, ist hier der reguläre Ausdruck: (?<=\[).*?(?=\])

Lass es uns zusammenbrechen

Der . stimmt mit allen Zeichen außer den Zeilenabschlusszeichen überein. Der ?= ist ein positiver Lookahead . Ein positiver Lookahead findet eine Zeichenfolge, wenn eine bestimmte Zeichenfolge danach kommt. Der ?<= ist ein positiver Lookbehind . Ein positiver Lookbehind findet eine Zeichenkette, wenn eine bestimmte Zeichenkette davor steht. Um this zu zitieren,

Positiv nach vorne schauen (? =)

Suchen Sie den Ausdruck A, wobei der Ausdruck B folgt:

A(?=B)

Schau hinter das Positive (? <=)

Suchen Sie nach Ausdruck A, wobei Ausdruck B voransteht:

(?<=B)A

Die Alternative

Wenn Ihre Regex-Engine keine Lookaheads und Lookbehinds unterstützt, können Sie mit der Regex-Funktion \[(.*?)\] die Innereien der Klammern in einer Gruppe erfassen und dann die Gruppe nach Bedarf bearbeiten.

Wie funktioniert dieser reguläre Ausdruck?

Die Klammern erfassen die Zeichen in einer Gruppe. Der .*? ruft alle Zeichen in Klammern ab (mit Ausnahme der Zeilenabschlusszeichen, es sei denn, Sie haben das s -Flag aktiviert), und zwar auf eine Weise, die nicht gierig ist.

3
LJ Germain

Dieser Code extrahiert den Inhalt zwischen eckigen Klammern und Klammern

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

(?: 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]+[]])

Vorstehend soll anhand der folgenden Erläuterung gearbeitet werden

  • zeichen in eckigen Klammern [] definieren die Zeichenklasse. Dies bedeutet, dass das Muster mindestens einem in eckigen Klammern angegebenen Zeichen entsprechen muss

  • \ s gibt ein Leerzeichen an

  • + bedeutet mindestens eines der zuvor unter + genannten Zeichen.

3
spooks

So geht's mit JS:

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

Das ergibt folgenden String:

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