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.
[^]]
ist schneller als nicht gierig (?
) und funktioniert auch mit Regex-Aromen, die nicht gierig unterstützen. Nicht gierig sieht jedoch besser aus.[
]
von der Ausgabe ausschließen (Ergebnis)?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:
quelle
.
darin enthalten ist ...Das sollte gut gehen:
quelle
\[([^\[\]]*)\]
, um den Inhalt in die innerste Klammer zu bekommen. Wenn Sie in schauenlfjlksd [ded[ee]22]
dann\[([^]]+)\]
werden Sie erhalten ,[ded[ee]
während die vorgeschlagene Ausdruck zurückkehren würde[ee]
. Testede in LinkKönnen Klammern verschachtelt werden?
Wenn nicht: Entspricht
\[([^]]+)\]
einem Element, einschließlich eckiger Klammern. Die Rückreferenz\1
enthält das Element, das übereinstimmen soll. Wenn Ihr Regex-Geschmack Lookaround unterstützt, verwenden SieDies stimmt nur mit dem Element in Klammern überein.
quelle
/g
Flags in JavaScript).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 ,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 dass
Flag nicht aktiviert haben) in einer Weise ab, die nicht gierig ist.quelle
(?<=\[).*?(?=\])
funktioniert gut wie oben angegeben. Hier ist ein Python-Beispiel:quelle
[]
), nicht um Klammern.Nur für den Fall, dass Sie unausgeglichene Klammern hatten , können Sie wahrscheinlich einen Ausdruck mit einer ähnlichen Rekursion entwerfen wie:
Dies würde sich natürlich auf die Sprache oder die RegEx-Engine beziehen, die Sie möglicherweise verwenden.
RegEx Demo 1
Davon abgesehen,
RegEx Demo 2
oder,
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:
Prüfung
Quelle
Regulärer Ausdruck passend zu ausgewogenen Klammern
quelle
wenn Sie Füller nur kleinen Buchstaben zwischen eckigen Klammern az wollen
Wenn Sie Kleinbuchstaben und Großbuchstaben von a-zA-Z möchten
wenn Sie Kapitälchen und Zahlenbuchstaben a-zA-Z0-9 möchten
wenn Sie alles zwischen eckigen Klammern wollen
Wenn Sie Text, Zahlen und Symbole möchten
quelle
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.
quelle
A-Z
sollte 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!std::regex pattern{R"(["][a-zA-Z \s]+["])"};
Dieser Code extrahiert den Inhalt zwischen eckigen Klammern und Klammern
quelle
Versuchen Sie in R:
quelle
gsub(pat, "\\1", x, perl=TRUE)
, wopat
ist der reguläre Ausdruck, den Sie angegeben haben ..Ich musste Zeilenumbrüche und die Klammern einschließen
\[[\s\S]+\]
quelle
Um einen Teilstring zwischen dem ersten
[
und dem letzten]
abzugleichen , können Sie verwendenSehen 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, Pythonre
/regex
, .NET, Golang, POSIX (grep, sed, bash)\[[^\][]*]
- ECMAScript (JavaScript, C ++std::regex
, VBARegExp
)\[[^\]\[]*]
- Java Regex\[[^\]\[]*\]
- Onigmo (Ruby, erfordert das Entkommen von Klammern überall)Ohne die Klammern:
(?<=\[)[^][]*(?=])
- PCRE, Pythonre
/regex
, .NET (C # usw.), ICU (Rstringr
), 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:
\[((?:[^][]++|(?R))*)]
- PHP PCRE\[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]
- .NET-Demo\[(?:[^\]\[]++|(\g<0>))*\]
- Onigmo (Ruby) Demoquelle