Entfernen Sie alles außer was in Klammern ist?

687
Malik agar

Ich möchte den gesamten Text mit Ausnahme von [und ]und was dazwischen liegt, entfernen . Wie gehe ich in Notepad ++ vor?

Beispieleingabe:

[A B C] bla bla text here [D E F] bla bla text here [G H I] bla bla bla here [J K L] M N O] bla bla text here [P Q R [S T U] even more bla 

Gewünschte Leistung:

[A B C][D E F][G H I] [J K L] M N O][P Q R [S T U] 

Die erste Zeile, in der die Klammern in übereinstimmenden [... ]Paaren vorkommen, ist ziemlich einfach zu handhaben. Die zweite ist knifflig: Ich möchte [... ]Paar Klammern behalten, auch wenn sie andere Klammern enthalten. (Ich habe Schwierigkeiten, einen Weg zu finden, um dies genau zu beschreiben; siehe die Beispiele.)

Ich habe ein paar Lösungen entwickelt, die einige Fälle richtig stellen:

Antwort 1:

Find what: [^\]]+(\[|$)  Replace with: \1  Gives me: [A B C][D E F][G H I] [J K L] M N O][S T U] 

Beachten Sie, dass dieses [J K L] M N O]Recht das Recht bekommt, das aber verwirft [P Q R .


Antwort 2:

Find what: [^\[]*(\[.*?\])[^\[]*  Replace with: $1  Gives me: [A B C][D E F][G H I] [J K L][P Q R [S T U] 

Umgekehrt erhält dieses [P Q R [S T U]Recht das Recht, verwirft jedoch das  M N O].


Wie kann ich es bekommen, was ich will?

0

2 Antworten auf die Frage

1
Scott

Ich habe kein Notepad ++ (yeah, ich weiß, ich wohne in einer Höhle), aber ich habe vi(in Cygwin), und es scheint ähnliche Fähigkeiten zu haben. Und dieser Befehl

s/\(^\|]\)[^][]*\(\[\|$\)/\1\2/g 

gab mir dein gewünschtes Ergebnis für deine Eingabe. Ich werde es hoffentlich ausführlich erklären, damit Sie es in Notepad ++ ese übersetzen können:

  • Die Gesamtstruktur von vi‚s s ubstitute Befehl lautet:
    s (Trennzeichen) (find what) (Trennzeichen) (ersetzen durch) (Trennzeichen) (Optionen)
    wo der herkömmliche Begrenzer ist /und die gOption für g lobal steht (dh die Ersetzung in jeder Zeile so oft wie möglich durchführen). Also haben wir
    s / (was finden) / (ersetzen durch) / g
  • Ich finde was ist \(^\|]\)[^][]*\(\[\|$\). In Stücken (mit Leerzeichen zur Syntaxbeleuchtung):
    • \( ^ \| ] \)
      Dies ist eine Capture-Gruppe ( \(…\)), die aus dem Anfang der Zeile ( ^) oder aus a besteht ].
    • [ ^ ][ ]
      Eine Reihe von Zeichen.  [^abc]würde mit jedem anderen Zeichen als a, boder übereinstimmen c. Dies entspricht einem beliebigen Zeichen außer a ]oder a [. (In regulären Unix-Ausdrücken fügen Sie ein ]Zeichen in eine Gruppe von Zeichen ein, indem Sie es zuerst oder unmittelbar nach einem Anfangsbuchstaben  ^einfügen. Offenbar in Notepad ** tun Sie dies, indem Sie mit Escapezeichen \?)
    • [ ^ ][ ] *
      Null oder mehr der oben genannten.
    • \( \[ \| $ \)
      Eine andere Fanggruppe; Dies ist eine Art Spiegelbild des ersten. Es ist ein [oder das Ende der Zeile. (Wir müssen dem [mit einem entkommen \, um es zu einem gewöhnlichen Charakter zu machen.)
  • Mein Ersetzen mit ist \1\2,
    das sind einfach die zwei Erfassungsgruppen.

Wenn Sie es auf Englisch setzen, entfernen wir Zeichenketten mit maximaler Länge, bei denen andere als [oder ] erscheinen

  • vor dem ersten [(dh zwischen dem Anfang der Zeile und a [) oder
  • zwischen a ]und a [oder
  • nach dem letzten ](dh zwischen a ]und dem Ende der Zeile).
0
Toto

Notepad ++ verwenden

  • Ctrl+H
  • Finde was: (?:^|(?<=]))[^][]*?(?=\[|$)
  • Ersetzen mit: LEAVE EMPTY
  • Aktivieren Sie die Option Wrap around
  • Überprüfen Sie den regulären Ausdruck
  • Replace all

Erläuterung:

(?: # start non capture group ^ # beginning of line | # OR (?<=]) # positive lookbehind, zero-length assertion that make sure we have a closing square bracket before ) # end group [^][]*? # negative character class, any character that is not openning or closing square bracket, may appear 0 or more times, not greedy (?= # start positive lookahead, zero-length assertion that make sure we have after \[ # an openning square bracket | # OR $ # end of line ) # ed lookahead 

Ergebnis für gegebenes Beispiel:

[A B C][D E F][G H I] [J K L] M N O][P Q R [S T U]