621 Stimmen

Regulärer Ausdruck zum Extrahieren von Text zwischen eckigen Klammern

Einfache Regex-Frage. Ich habe eine Zeichenfolge auf das folgende Format:

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

Wie lautet der reguläre Ausdruck, um die Wörter innerhalb der eckigen Klammern zu extrahieren, d. h.

sample
some
another one

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

1110voto

codaddict Punkte 426877

Sie können die folgende Regex verwenden weltweit :

\[(.*?)\]

Erläuterung:

  • \[ : [ ist ein Meta-Zeichen und muss escaped werden, wenn es wörtlich übereinstimmen soll.
  • (.*?) : alles auf eine nicht gierige Art und Weise abgleichen und festhalten.
  • \] : ] ist ein Meta-Zeichen und muss escaped werden, wenn es wörtlich übereinstimmen soll.

220voto

Adam Moszczyński Punkte 3209
(?<=\[).+?(?=\])

Erfasst Inhalte ohne Klammern

  • (?<=\[) - positive Rückschau für [

  • .*? - non greedy match für den Inhalt

  • (?=\]) - positive Vorhersage für ]

EDIT: Für verschachtelte Klammern sollte die folgende Regex funktionieren:

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

104voto

jasonbar Punkte 12905

Das sollte klappen:

\[([^]]+)\]

40voto

Tim Pietzcker Punkte 311448

Können Klammern verschachtelt werden?

Wenn nicht: \[([^]]+)\] entspricht einer Position, einschließlich eckiger Klammern. Backreference \1 enthält das zu übereinstimmende Element. Wenn Ihre Regex-Variante Lookaround unterstützt, verwenden Sie

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

Damit wird nur das Element innerhalb der Klammern gefunden.

34voto

Wiktor Stribiżew Punkte 551798

Um eine Teilzeichenkette abzugleichen zwischen den erste [ y zuletzt ] können Sie verwenden

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

Siehe eine Regex-Demo et un regex demo #2 .

Verwenden Sie die folgenden Ausdrücke, um Zeichenfolgen abzugleichen zwischen den am nächsten eckige Klammern :

  • Einschließlich der Klammern:

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

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

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

  • \[[^\]\[]*\] - Onigmo (Ruby, erfordert das Escapen von Klammern überall)

  • Ohne die Klammern:

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

  • \[([^][]*)] - Bash , Golang - erfassen den Inhalt zwischen den eckigen Klammern mit einem Paar von nicht ausgeschnittenen Klammern, siehe auch unten

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

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

  • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, erfordert das Escapen von Klammern überall)

NOTA : * mit 0 oder mehr Zeichen übereinstimmt, verwenden Sie + auf 1 oder mehr übereinstimmen, um leere Zeichenfolgen in der resultierenden Liste/Aufstellung zu vermeiden.

Wenn beide Lookaround-Unterstützungen zur Verfügung stehen, stützen sich die oben genannten Lösungen auf sie, um die führende/nachlaufende Auf/Zu-Klammer auszuschließen. Andernfalls sollten Sie sich auf Erfassungsgruppen verlassen (Links zu den gängigsten Lösungen in einigen Sprachen wurden bereitgestellt).

Wenn Sie eine Übereinstimmung finden müssen verschachtelte Klammern können Sie die Lösungen in der Regulärer Ausdruck für die Übereinstimmung von ausgeglichenen Klammern und ersetzen Sie die runden Klammern durch die eckigen, um die erforderliche Funktionalität zu erhalten. Sie sollten Erfassungsgruppen verwenden, um auf den Inhalt zuzugreifen, wobei offene/geschlossene Klammern ausgeschlossen sind:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X