#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