Регулярное выражение Atom: удаление многострочного текста вокруг блоков

#regex #atom-editor

Вопрос:

Предположим, у меня есть это сообщение:

 blah blah Bob Loblaw Law blah
keep1 { i want this } blop
blah blob keep2 { and
this too } blaw blat
etc...
 

И я хочу закончить тем, что

 keep1 { i want this }
keep2 { and
this too }
 

или, может быть,:

 keep1 { i want this }
keep2 { and this too }
 

Я не понял, как заставить механизм поиска/замены регулярных выражений Atom отбрасывать все в нескольких строках за пределами определенной совпадающей строки. Намеки?

Обновить:

Из многих вещей, которые я пробовал, это приближает меня ближе всего:

 [Ss] ?(keepds {[Ss] ?})
 

что приводит к:

 keep1 { i want this }
keep2 { and
this too }
 blaw blat
etc...
 

Это, вероятно, достаточно хорошо-я могу редактировать конечные фрагменты, — но было бы полезно знать, как их обрезать.

Комментарии:

1. @anubhava, Конечно-я перепробовал много вещей, прежде чем обратиться к S. O. Я обновил вопрос с лучшими результатами, которые я получил.

2. Как насчет этого: keepds {[^}]*} — работает ли это в atom-редакторе?

Ответ №1:

Для этой задачи вы можете использовать эту простую замену регулярного выражения в Atom:

 b(keepd s*{[^}]*})|. ?
 

Замените его на: $1

Демонстрация регулярных выражений

Сведения о регулярном выражении:

  • b : Граница слов
  • (keepd s*{[^}]*}) : В группе захвата #1 сопоставьте строку, начинающуюся с keep 1 цифр, за которой следуют пробелы 0 , за которыми следует любой текст, который также находится внутри {...} и пересекает строки. Это предполагает { , что и } сбалансированы, и нет выхода из { и } .
  • | : ИЛИ
  • . ? : Лениво сопоставьте 1 чего угодно

PS: Если вы хотите удалить разрыв начальной строки, используйте:

 n?b(keepd s*{[^}]*})|. ?
 

Демонстрационная версия редактора Atom

Перед заменой:

введите описание изображения здесь

После замены:

введите описание изображения здесь

Комментарии:

1. Хорошее решение, которое не зависит от перспектив.

Ответ №2:

Воспользуйся

 [sS]*?(keepds {[^{}]*})|(?:(?!keepds {[^{}]*})[sS]) $
 

Смотрите доказательства.

объяснение

 --------------------------------------------------------------------------------
  [sS]*?                 any character of: whitespace (n, r, t,
                           f, and " "), non-whitespace (all but n,
                           r, t, f, and " ") (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    keep                     'keep'
--------------------------------------------------------------------------------
    d                       digits (0-9)
--------------------------------------------------------------------------------
    s                       whitespace (n, r, t, f, and " ") (1
                             or more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    {                       '{'
--------------------------------------------------------------------------------
    [^{}]*                   any character except: '{', '}' (0 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    }                       '}'
--------------------------------------------------------------------------------
  )                        end of 1
--------------------------------------------------------------------------------
 |                        OR
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (1 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
      keep                     'keep'
--------------------------------------------------------------------------------
      d                       digits (0-9)
--------------------------------------------------------------------------------
      s                       whitespace (n, r, t, f, and " ")
                               (1 or more times (matching the most
                               amount possible))
--------------------------------------------------------------------------------
      {                       '{'
--------------------------------------------------------------------------------
      [^{}]*                   any character except: '{', '}' (0 or
                               more times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
      }                       '}'
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
    [sS]                   any character of: whitespace (n, r,
                             t, f, and " "), non-whitespace (all
                             but n, r, t, f, and " ")
--------------------------------------------------------------------------------
  )                        end of grouping
--------------------------------------------------------------------------------
  $                        before an optional n, and the end of the
                           string