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.

25voto

LJ Germain Punkte 389

Wenn Sie die Klammern nicht in die Übereinstimmung einbeziehen wollen, ist hier die Regex: (?<=\[).*?(?=\])

Schlüsseln wir es auf

El . passt auf jedes Zeichen, außer auf Zeilenabschlüsse. Die ?= es un positive Vorausschau . Ein positiver Lookahead findet eine Zeichenkette, wenn eine bestimmte Zeichenkette nach ihr kommt. Die ?<= es un positive Rückschau . Ein positives Nachschlagen findet eine Zeichenfolge, wenn ihr eine bestimmte Zeichenfolge vorausgeht. Um zu zitieren こん ,

Vorausschauend positiv (?=)

Finden Sie den Ausdruck A, auf den der Ausdruck B folgt:

A(?=B)

Blick hinter das Positive (?<=)

Finde Ausdruck A wo Ausdruck B vorausgeht:

(?<=B)A

Die Alternative

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

Wie funktioniert diese Regex?

Die Klammern fassen die Zeichen in einer Gruppe zusammen. Die .*? erhält alle Zeichen zwischen den Klammern (mit Ausnahme von Zeilenabschlüssen, es sei denn, Sie haben die Option s Flag aktiviert) auf eine Weise, die nicht gierig ist.

20voto

Emma Punkte 26329

Nur für den Fall, dass Sie schon einmal unsymmetrische Klammern können Sie wahrscheinlich einen Ausdruck mit Rekursion entwerfen, ähnlich wie,

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

was sich natürlich auf die Sprache oder die RegEx-Engine bezieht, die Sie möglicherweise verwenden.

RegEx Demo 1


Abgesehen davon,

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

RegEx Demo 2

oder,

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

RegEx Demo 3

sind gute Optionen, die es zu erkunden gilt.


Wenn Sie den Ausdruck vereinfachen/verändern/erforschen möchten, finden Sie eine Erklärung oben rechts auf der Seite regex101.com . Wenn Sie möchten, können Sie die Sendung auch in ce lien wie sie mit einigen Beispieleingaben übereinstimmen würde.


RegEx-Schaltung

jex.im visualisiert reguläre Ausdrücke:

enter image description here

Test

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 für die Übereinstimmung von ausgeglichenen Klammern

13voto

devd Punkte 163

(?<=\[).*?(?=\]) funktioniert gemäß der obigen Erklärung gut. 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'"

11voto

Die Antwort von @Tim Pietzcker aquí

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

ist fast das, wonach ich gesucht habe. Aber es gibt ein Problem, dass einige Legacy-Browser auf positive lookbehind fehlschlagen kann. Also musste ich meinen Tag selbst gestalten :). Ich habe es geschafft, dies zu schreiben:

/([^[]+(?=]))/g

Vielleicht hilft es ja jemandem.

console.log("this is a [sample] string with [some] special words. [another one]".match(/([^[]+(?=]))/g));

6voto

ßãlãjî Punkte 6434

wenn Sie nur kleine Buchstaben zwischen den eckigen Klammern a-z ausfüllen möchten

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

wenn Sie Klein- und Großbuchstaben a-zA-Z wünschen

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

wenn Sie Kapitälchen und die Buchstaben a-zA-Z0-9 wünschen

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

wenn Sie alles zwischen eckigen Klammern haben wollen

wenn Sie Text, Zahlen und Symbole wünschen

(\[.*\])

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