Пожалуйста, люблю объяснять!
Однострочный режим
(?-s) однострочный режим выключен, это
стандартное состояние обработки греп-запросов: оператор .* выбирает все символы, начиная от текущей позиции до конца абзаца, но сам конец абзаца в выборку не попадает.
Когда однострочный режим выключён, поиск с использованием метасимвола . (точка) выполняется в пространстве абзаца, в котором стоит курсор. Аналогия — каждый абзац в статье является отдельной строкой.
(?s) одиночный режим включён, в выборку попадает и знак перевода строки. Т.е. будет выбран весь текст от точки курсора до конца статьи. А если курсор не в тексте, а выбран фрейм, то будет выбрана вся статья.
Когда однострочный режим активен, поиск с использованием метасимвола . (точка) выполняется в пространстве всей статьи. Статья превращается в одну строку.
Важно: если в тексте запроса нет метасимвола
точка, то не имеет значения, какой вариант однострочного режима сейчас установлен.
Многострочный ражим
(?m) многострочный режим включён, это
стандартное состояние обработки греп-запросов, знаки ^ и $ определяют начало и конец абзаца.
Когда многострочный режим активен, поиск с использованием метасимволов ^ и $ выполняется в пространстве абзаца, в котором стоит курсор. В статье столько строк, сколько там есть абзацев.
(?-m) многострочный режим выключен, знак ^ интерпретируется как \A — маркер начала статьи, а знак $ как \Z — маркер конца статьи.
Когда многострочный режим выключен, метасимволы ^ и $ интерпретируются как маркеры начала и конца статьи, \A и \Z соответственно. Поиск выполняется в пространстве всей статьи. Вся статья — одна строка.
Важно: если в тексте запроса нет метасимволов ^ и $, то не имеет значения, какой вариант многострочного режима сейчас установлен.
Для понимания
Если есть два абзаца
Фраза
Слово
то любой из запросов .+ или (?-s).+ найдёт сперва абзац Фраза, а потом абзац Слово. В выборке будут только печатные знаки.
А если у нас такой запрос (?s).+, то он будет видеть этот текст так, в виде одной строки:
Фраза\rСлово
и этот запрос выберет все знаки в этой строке.
Строки ^фраза и (?m)^фраза обозначают поиск текста фраза в начале
любой строки.
Строки слово$ и (?m)слово$ обозначают поиск текста слово в конце
любой строки.
Строка (?-m)^фраза обозначает поиск текста фраза в начале
статьи. Строка (?-m)слово$ обозначает поиск текста слово в конце
статьи. Очевидно, что эти запросы можно переписать иначе, сделав их более понятными: \Aфраза и слово\Z.
(Этот текст — часть из 12 занятия. Дальше в этом уроке о взаимодействии этих режимов. Там есть важные, неочевидные моменты.
Всего занятий 17, и к ним 112 задач по грепу.
Обучение мастерству применения GREP. Вариант 1)