Удалить все, кроме того, что в скобках?

506
Malik agar

Я хочу удалить весь текст, кроме [и ]и что между ними. Как бы я поступил так в Notepad ++?

Пример ввода:

[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 

Желаемый результат:

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

Первая строка, в которой скобки встречаются в совпадающих [... ]парах, довольно проста в обращении. Второй хитрый: я хочу сохранить [... ]пары скобок, даже если они содержат другие скобки. (У меня проблемы с поиском способа описать это точно; см. Примеры.)

Я разработал пару решений, в которых есть правильные случаи:

Ответ 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] 

Обратите внимание, что этот получает [J K L] M N O]право, но отбрасывает [P Q R .


Ответ 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] 

Этот, наоборот, получает [P Q R [S T U]право, но отбрасывает  M N O].


Как я могу получить это, чтобы дать мне то, что я хочу?

0

2 ответа на вопрос

1
Scott

У меня нет Notepad ++ (да, я знаю; я живу в пещере), но у меня есть vi(в Cygwin), и, похоже, у него есть похожие возможности. И эта команда

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

дал мне желаемый результат для вашего вклада. Я объясню, надеюсь, достаточно подробно, чтобы вы могли перевести его на Notepad ++ ese:

  • Общая структура vi«S с ubstitute команды:
    s  (разделитель) (найти что) (разделитель) (заменить на) (разделитель) (варианты)
    где обычный разделитель /, а gопция обозначает г lobal (т. е. делайте замену как можно больше раз в каждой строке). Итак, мы имеем
    s / (найти что) / (заменить на) / г
  • Моя находка что есть \(^\|]\)[^][]*\(\[\|$\). По частям (с пробелами, добавленными для подсветки синтаксиса):
    • \( ^ \| ] \)
      Это группа захвата ( \(…\)), которая состоит из начала строки ( ^) или a ].
    • [ ^ ][ ]
      Набор символов.  [^abc]будет соответствовать любому символу, кроме a, bили c. Это соответствует любому символу, кроме a ]или a [. (В регулярных выражениях Unix вы включаете ]в набор символов, ставя его первым или сразу после начального  ^. Очевидно, в Блокноте ** вы делаете это, экранируя его \?)
    • [ ^ ][ ] *
      Ноль или более из вышеперечисленного.
    • \( \[ \| $ \)
      Другая группа захвата; это своего рода зеркальное отображение первого. Это [конец или конец строки. (Мы должны сбежать [с \символом, чтобы сделать его обычным персонажем.)
  • Мой заменить есть \1\2,
    что просто два захват группы.

Помещая его на английский, мы удаляем строки максимальной длины символов, отличные от [или ] которые появляются

  • перед первым [(т. е. между началом строки и а [), или
  • между а ]и а [, или
  • после последнего ](то есть между a ]и концом строки).
0
Toto

Использование Notepad ++

  • Ctrl+H
  • Найти то, что: (?:^|(?<=]))[^][]*?(?=\[|$)
  • Заменить: LEAVE EMPTY
  • проверить обернуть
  • проверьте регулярное выражение
  • Replace all

Объяснение:

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

Результат для данного примера:

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

Похожие вопросы