Regulärer Ausdruck zum Extrahieren von Text in eckigen Klammern

411

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 den eckigen Klammern zu extrahieren, dh.

sample
some
another one

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

Obi Wan Kenobi
quelle

Antworten:

765

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

\[(.*?)\]

Erläuterung:

  • \[: [ist ein Metazeichen und muss maskiert werden, wenn Sie es buchstäblich abgleichen möchten.
  • (.*?) : Passen Sie alles auf eine nicht gierige Weise an und erfassen Sie es.
  • \]: ]ist ein Metazeichen und muss maskiert werden, wenn Sie es buchstäblich abgleichen möchten.
Codaddict
quelle
9
Die Methode der anderen Antwort [^]]ist schneller als nicht gierig ( ?) und funktioniert auch mit Regex-Aromen, die nicht gierig unterstützen. Nicht gierig sieht jedoch besser aus.
Ipsquiggle
183
Wie [ ]von der Ausgabe ausschließen (Ergebnis)?
Mickey Tin
9
@MickeyTin, wenn Sie Java verwenden, können Sie es mit Gruppe (1) über nur Gruppe () gruppieren, so dass das '[]' nicht zusammen
passt
21
Dies entspricht nur dem ersten Vorkommen
hfatahi
9
Wie schließen Sie die Klammern von der Rücksendung aus?
Jzadra
119
(?<=\[).+?(?=\])

Erfasst Inhalte ohne Klammern

  • (?<=\[) - Positiver Lookbehind für [

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

  • (?=\]) - Positiver Lookahead für ]

BEARBEITEN: Für verschachtelte Klammern sollte der folgende reguläre Ausdruck funktionieren:

(\[(?:\[??[^\[]*?\]))
Adam Moszczyński
quelle
3
@igaurav Ich habe es überprüft und es funktioniert. Es funktioniert jedoch nicht in Umgebungen, in denen Lookbehinds wie Javascript nicht unterstützt werden. Vielleicht ist das dein Fall?
Adam Moszczyński
Adam, Ihre Lösung für verschachtelte Klammern schlägt fehl, wenn eine Zeichenfolge mit einem .darin enthalten ist ...
Patrick
89

Das sollte gut gehen:

\[([^]]+)\]
jasonbar
quelle
5
In meinem Anwendungsfall kann der Text in Klammern neue Zeilen enthalten, und dieser reguläre Ausdruck funktioniert, während die akzeptierte Antwort dies nicht tut.
Dave
1
Was bedeutet die Zeichenklasse [^]? Was passt dazu?
Richard
3
@ Richard, The ^ negiert die Zeichenklasse. Es bedeutet "jedes Zeichen, das kein] ist".
Jason Bar
8
Ich denke, es funktioniert nicht wie erwartet, Sie sollten verwenden \[([^\[\]]*)\], um den Inhalt in die innerste Klammer zu bekommen. Wenn Sie in schauen lfjlksd [ded[ee]22]dann \[([^]]+)\]werden Sie erhalten , [ded[ee]während die vorgeschlagene Ausdruck zurückkehren würde [ee]. Testede in Link
TMC
1
Können Sie bitte Beispiele für 'sed' und 'awk' angeben, um diesen regulären Ausdruck zu verwenden und Text zu extrahieren? Vielen Dank.
Valentt
32

Können Klammern verschachtelt werden?

Wenn nicht: Entspricht \[([^]]+)\]einem Element, einschließlich eckiger Klammern. Die Rückreferenz \1enthält das Element, das übereinstimmen soll. Wenn Ihr Regex-Geschmack Lookaround unterstützt, verwenden Sie

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

Dies stimmt nur mit dem Element in Klammern überein.

Tim Pietzcker
quelle
@KunalMukherjee: Nein, der Regex kann beliebig oft übereinstimmen. Einige Regex-Varianten müssen jedoch explizit angewiesen werden, die Regex wiederholt anzuwenden (z. B. mithilfe des /gFlags in JavaScript).
Tim Pietzcker
14

Wenn Sie die Klammern nicht in das Spiel aufnehmen möchten, finden Sie hier den regulären Ausdruck: (?<=\[).*?(?=\])

Lassen Sie es uns zusammenfassen

Das .entspricht jedem Zeichen außer den Zeilenabschlüssen. Das ?=ist ein positiver Lookahead . Ein positiver Lookahead findet eine Zeichenfolge, wenn eine bestimmte Zeichenfolge danach kommt. Das ?<=ist ein positiver Lookbehind . Ein positiver Lookbehind findet eine Zeichenfolge, wenn eine bestimmte Zeichenfolge davor steht. Um dies zu zitieren ,

Schauen Sie positiv nach vorne (? =)

Finden Sie Ausdruck A, wobei Ausdruck B folgt:

A(?=B)

Schauen Sie hinter positiv (? <=)

Suchen Sie Ausdruck A, wobei Ausdruck B vorangestellt ist:

(?<=B)A

Die Alternative

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

Wie funktioniert dieser Regex?

Die Klammern erfassen die Zeichen in einer Gruppe. Das .*?ruft alle Zeichen in Klammern (mit Ausnahme der Zeilenabschlusszeichen, sofern Sie das sFlag nicht aktiviert haben) in einer Weise ab, die nicht gierig ist.

LJ Germain
quelle
12

(?<=\[).*?(?=\])funktioniert gut wie oben angegeben. 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'"
devd
quelle
1
Sie sollten immer die Code-Formatierung für reguläre Ausdrücke verwenden, wo immer sie erscheinen. Wenn sich die Regex im Text und nicht in einem Codeblock befindet, können Sie sie mit Backticks formatieren. ( ref )
Alan Moore
1
Außerdem ging es um eckige Klammern ( []), nicht um Klammern.
Alan Moore
6

Nur für den Fall, dass Sie unausgeglichene Klammern hatten , können Sie wahrscheinlich einen Ausdruck mit einer ähnlichen Rekursion entwerfen wie:

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

Dies würde sich natürlich auf die Sprache oder die RegEx-Engine beziehen, die Sie möglicherweise verwenden.

RegEx Demo 1


Davon abgesehen,

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

RegEx Demo 2

oder,

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

RegEx Demo 3

sind gute Möglichkeiten zu erkunden.


Wenn Sie den Ausdruck vereinfachen / ändern / untersuchen möchten, wurde dies im oberen rechten Bereich von regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.


RegEx Circuit

jex.im visualisiert reguläre Ausdrücke:

Geben Sie hier die Bildbeschreibung ein

Prüfung

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}`);
    });
}

Quelle

Regulärer Ausdruck passend zu ausgewogenen Klammern

Emma
quelle
4

wenn Sie Füller nur kleinen Buchstaben zwischen eckigen Klammern az wollen

(\[[a-z]*\])

Wenn Sie Kleinbuchstaben und Großbuchstaben von a-zA-Z möchten

(\[[a-zA-Z]*\]) 

wenn Sie Kapitälchen und Zahlenbuchstaben a-zA-Z0-9 möchten

(\[[a-zA-Z0-9]*\]) 

wenn Sie alles zwischen eckigen Klammern wollen

Wenn Sie Text, Zahlen und Symbole möchten

(\[.*\])
ßãlãjî
quelle
3
([[][a-z \s]+[]])

Oben sollte mit der folgenden Erklärung funktionieren

  • Zeichen in eckigen Klammern [] definieren die Zeichenklasse, was bedeutet, dass das Muster mindestens mit einem in eckigen Klammern angegebenen Zeichen übereinstimmen sollte

  • \ s gibt ein Leerzeichen an

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

Gespenster
quelle
In sensiblen Fällen A-Zsollte das Muster hinzugefügt werden : ([[][a-zA-Z \s]+[]]); Ich denke, es ist ein guter Weg, während \ in Regex-Mustern, die in Zeichenfolgen ("und") definiert sind und Neulinge durch Backslash-Behandlung in "oder" Verwendungen verwechselt werden!
MohaMad
Die einzige Antwort, die für mich für C ++ Regex funktioniert hat (außer ich mache es mit Anführungszeichen anstelle von Klammern). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack
3

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
Nezar Fadle
quelle
3

Versuchen Sie in R:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
Tony Ladson
quelle
..oder gsub(pat, "\\1", x, perl=TRUE), wo patist der reguläre Ausdruck, den Sie angegeben haben ..
Karsten W.
0

Ich musste Zeilenumbrüche und die Klammern einschließen

\[[\s\S]+\]

Stadtmensch
quelle
0

Um einen Teilstring zwischen dem ersten [ und dem letzten ] abzugleichen , können Sie verwenden

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

Sehen Sie sich eine Regex-Demo und eine Regex-Demo Nr. 2 an .

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

  • Einschließlich der Klammern:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - Java Regex
    • \[[^\]\[]*\] - Onigmo (Ruby, erfordert das Entkommen von Klammern überall)
  • Ohne die Klammern:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C # usw.), ICU (R stringr), JGSoft-Software
    • \[([^][]*)]- Bash , Golang - Erfassen Sie den Inhalt zwischen den eckigen Klammern mit einem Paar ungehinderter Klammern, siehe auch unten
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java Regex
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, erfordert das Entkommen von Klammern überall)

HINWEIS : *Entspricht 0 oder mehr Zeichen. Verwenden Sie diese Option , um 1 oder mehr Zeichen zuzuordnen+ , um leere Zeichenfolgenübereinstimmungen in der resultierenden Liste / dem resultierenden Array zu vermeiden.

Wann immer beide Lookaround-Unterstützung verfügbar ist, verlassen sich die oben genannten Lösungen darauf, dass sie die führende / nachfolgende offene / geschlossene Klammer ausschließen. Andernfalls verlassen Sie sich auf die Erfassung von Gruppen (Links zu den gängigsten Lösungen in einigen Sprachen wurden bereitgestellt).

Wenn Sie verschachtelte Klammern abgleichen müssen , sehen Sie möglicherweise die Lösungen im regulären Ausdruck, um den Thread mit ausgeglichenen Klammern abzugleichen und die runden Klammern durch die quadratischen zu ersetzen, um die erforderliche Funktionalität zu erhalten. Sie sollten Erfassungsgruppen verwenden, um auf den Inhalt zuzugreifen, wobei die Klammer zum Öffnen / Schließen ausgeschlossen ist:

Wiktor Stribiżew
quelle