Пример использования "Отрицательного поиска вперед" (negative lookahead) с пояснениями
"для гуманитариев".
Есть отличный скрипт "LinesFilter.js", призванный фильтровать строки, используя регулярные выражения.
Вкратце, скрипт позволяет работать в двух режимах фильтра:
1) Оставить строки, содержащие заданный образец;
2) Удалить строки, содержащие заданный образец.
Вопрос/Задача: Можно ли сделать это же с помощью одних только регулярных выражений и как?
Заглянем внутрь скрипта.
Код поиска паттерна (образца/шаблона) находится в строке 516:
oPattern=new RegExp((bAtLineStart?"":"^.*") + "(" + (bRegExp?pFindIt:EscRegExp(pFindIt)) + ")" + (bAtLineEnd?"":".*$") + "\n?", "gm" + (bSensitive?"":"i"));
Что тут происходит? В серединке введённый паттерн преобразуется к формату JScript. А по краям приклеиваются префикс "^.*" и суффикс ".*$\n?", обеспечивающие захват полной строки ("с начала строки" + "паттерн" + "до конца строки" + "конец строки"). Плюс дополнительные опции (регистрозависимость).
Таким образом решение
ВТОРОЙ части задачи "- Удалить строки, содержащие заданный образец" является очень простым. Достаточно "украсть" данное выражение и заменять в диалоге "Замена" на пустой образец:
Что:
Чем: _оставить пустым_
Опции: [v] Регулярные выражения
Теперь о том, как решить
ПЕРВУЮ часть задачи.
"Оставить строки, содержащие заданный образец" равнозначно выражению "Удалить строки, НЕ содержащие заданный образец"
И тут на помощь приходит negative lookahead:
(?!шаблон) -- Отрицательный поиск вперед (negative lookahead). Соответствие не сохраняется для последующего использования. Например, 'Windows (?!95|98|NT|2000)' соответствует "Windows" в "Windows 3.1", но не соответствует "Windows" в "Windows 2000".
Что: Code: Select all
(?-s)^((?!здесь ваш образец).)*$\n?
Чем: _оставить пустым_
Опции: [v] Регулярные выражения
===
P.S. Пояснение для "гуманитариев". Документация по регулярным выражениям в AkelPad занимает всего около двух страниц. Это конспект, а не учебник, и поэтому она не может являться исчерпывающим пособием по регулярным выражениям. Для сравнения, "специальная литература" по данному вопросу "в простом варианте" - это страниц 175, а в "углублённом" - около 600. Поэтому, если вам "непонятны" те или иные слова/термины в документации, то просто берите их "на карандаш" и обращайтесь к специальной литературе (ленивые - к Википедии). Ждать, "когда исправят документацию?"* бессмысленно (*ответ: "никогда").
Litterarum radices amarae, fructus dulces sunt. В переводе означает, что потраченное на "непонятные слова" время окупится раньше, чем многим кажется.