2016-11-28 10 views
1

Ich muss einen Ausdruck in Klammern extrahieren, die alles enthalten können, aber keine nicht maskierte, geschlossene Klammer.Ausschließen eines maskierten Zeichens aus einem Bereich

Zum Beispiel sollte die Regexp von [aaa\]bbbbbb] als Ergebnis geben: aaa\]bbbbbb.

Ich habe dies versucht: \[([^(?<!\\)\]]*)\] aber das scheitern.

Irgendwelche Hinweise?

+0

Super, danke! Ich werde etwas Zeit bekommen, um die Erklärung von der Werkzeugseite zu verstehen :) – sssimon

Antwort

1

können Sie verwenden

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

Oder - wenn es kann irgendein nicht-entkam [ in-zwischen nicht entgangen [ und ] (zB [a[\[aa\]bbbbbba\[aabbbbbb]), nehmen Sie die \[:

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

Siehe regex demo 1 und regex demo 2. Es ist ein unrolled variant eines \[((?:[^][\\]|\\.)*)] regex.

Einzelheiten:

  • \[ - ein [
  • ([^\]\[\\]*(?:\\.[^\]\[\\]*)*) - Gruppe 1 Capturing:
    • [^\]\[\\]* - null oder mehr Zeichen andere als [, ] und \ (in einigen Regex-Varianten , Sie können es ohne Escapes schreiben - [^][\\]*)
    • (?:\\.[^\]\[\\]*)* - null oder mehr Sequenzen von:
      • \\. - jeder entkommen Sequenz (\ und jedes char andere als Zeilenumbruch Zeichen
      • [^\]\[\\]* - null oder mehr Zeichen anders als [, ] und \
  • ] - ein Schließen ]. Diese
+0

Ihre Regex wird gegen etwas wie '[[[[aa \] bbbbbba \ [aabbbbbb]' (mit einer anderen öffnenden Klammer innerhalb der Klammern) – Aserre

+0

@Aserre versagen : Sicher, weil die nicht gesäumten '[' '' '' '' '' '' '''' '''' '' nicht ausgeglichen sind. Es wird nicht erwähnt, wie das Verhalten für diese Szenarien in OP aussehen sollte. –

+0

'Ich muss einen Ausdruck in Klammern extrahieren, die alles außer einer nicht-maskierten geschlossenen Klammer enthalten können. :) – Aserre

0

ist die einfachste regex, die (glaube ich) funktioniert:

\[(.*?)(?<!\\)\] 

, die den Text in Klammern als Gruppe live demo 1.

Siehe einfängt.

Verwandte Themen