Я хочу удалить весь текст, кроме [ и ] и что между ними.  Как бы я поступил так в 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] .


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

2 ответа2

1

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

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

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

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

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

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

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

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

Объяснение:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .