Remova tudo, exceto o que está entre parênteses?

0

Desejo remover todo o texto, exceto [e ]e o que há entre eles. Como eu faria isso no Notepad ++?

Exemplo de entrada:

[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

Saída desejada:

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

A primeira linha, onde os suportes ocorrer em correspondência [... ]pares, é bastante fácil de manusear. O segundo é complicado: quero manter [... ]pares de colchetes, mesmo que contenham outros colchetes. (Estou tendo problemas para encontrar uma maneira de descrever isso com precisão; veja os exemplos.)

Desenvolvi algumas soluções que acertam alguns casos:

Resposta 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]

Observe que este fica [J K L] M N O]certo, mas descarta o [P Q R .


Resposta 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]

Por outro lado, este acerta, [P Q R [S T U]mas descarta o  M N O].


Como posso obter o que quero?

Agar Malik
fonte

Respostas:

1

Eu não tenho o Notepad ++ (sim, eu sei; moro em uma caverna), mas tenho vi(no Cygwin), e parece ter recursos semelhantes. E esse comando

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

me deu o resultado desejado para sua contribuição. Vou explicar, espero que em detalhes suficientes para que você possa traduzi-lo para o Notepad ++ ese:

  • A estrutura geral do vi's s comando ubstitute é:
    s (delimitador) (encontre o que) (delimitador) (substitua por) (delimitador) (opções)
    onde o delimitador convencional é /, e a gopção meios g lobal (ou seja, fazer a substituição de tantas vezes quanto possível em cada linha). Então nós temos
    s / (encontre o que) / (substitua por) / g
  • Minha encontrar o que é \(^\|]\)[^][]*\(\[\|$\). Em pedaços (com espaços adicionados para iluminar a sintaxe):
    • \( ^ \| ] \)
      Este é um grupo de captura ( \(…\)) que consiste no início da linha ( ^) ou a ].
    • [ ^ ][ ]
      Um conjunto de caracteres.  [^abc]corresponderia a qualquer caractere que não seja a, bou c. Isso corresponde a qualquer caractere que não seja a ]ou a [. (Nas expressões regulares do Unix, você inclui a ]em um conjunto de caracteres colocando-o primeiro ou imediatamente após uma inicial  ^. Aparentemente, no Bloco de notas, você faz isso escapando-o com \?)
    • [ ^ ][ ] *
      Zero ou mais dos itens acima.
    • \( \[ \| $ \)
      Outro grupo de captura; essa é uma espécie de imagem espelhada da primeira. É um [ou o fim da linha. (Temos que escapar do [com a \para torná-lo um personagem comum.)
  • Minha substituição por é \1\2,
    que são simplesmente os dois grupos de captura.

Colocando em inglês, removemos seqüências de caracteres de tamanho máximo que não sejam [ou ] que apareçam

  • antes do primeiro [(ou seja, entre o início da linha e a [), ou
  • entre a ]e a [, ou
  • após o último ](ou seja, entre a ]e o final da linha).
Scott
fonte
0

Usando o Notepad ++

  • Ctrl+H
  • Encontre o que: (?:^|(?<=]))[^][]*?(?=\[|$)
  • Substituir com: LEAVE EMPTY
  • check Wrap around
  • check Expressão regular
  • Replace all

Explicação:

(?:         # 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

Resultado para um exemplo:

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