[ID CC-CC2022] Найти второе слово в абзаце оканчивающееся на "а"

  • Автор темы Автор темы Slx1
  • Дата начала Дата начала
надо
(?m)^(.+?а\b){2}\K.+?\K\b[-\w]+а\b
Михаил, а не могли бы Вы подробнее рассказать про
Код:
(?m)
Я вижу, что он работает, но суть ухватить не могу - когда его, а также
Код:
(?-m)
надо применять?
Как не очень понимаю и выражения типа
Код:
(?s) и (?-s)
Когда они жизненно необходимы?
 
Последнее редактирование:
Пожалуйста, люблю объяснять! :)

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

Строки ^фраза и (?m)^фраза обозначают поиск текста фраза в начале любой строки.
Строки слово$ и (?m)слово$ обозначают поиск текста слово в конце любой строки.
Строка (?-m)^фраза обозначает поиск текста фраза в начале статьи. Строка (?-m)слово$ обозначает поиск текста слово в конце статьи. Очевидно, что эти запросы можно переписать иначе, сделав их более понятными: \Aфраза и слово\Z.

(Этот текст — часть из 12 занятия. Дальше в этом уроке о взаимодействии этих режимов. Там есть важные, неочевидные моменты.
Всего занятий 17, и к ним 112 задач по грепу. Обучение мастерству применения GREP. Вариант 1)
 
Последнее редактирование:
Но инструмент до конца не ясен. :(
Возможно, поэтому Питер Карел не включил его в свою последнюю книгу.
Заморочка вот в чём: по умолчанию многострочный режим (?m) включён.
А по факту он включён как-то частично. И когда этот по умолчанию включённый режим подкрепишь ещё оператором ?m, всё станет работать иначе.
У меня есть соображения, почему это, но пока всё в стадии неспешной переписки/обсуждения с другими гурами.
Как проясню, сообщу.
 
  • Спасибо
Реакции: NNN5 и LeonidB
Объяснения #22 не дают полной картины. Коль скоро это разные инструменты, они могут взаимодействовать, т.е.
вот такая таблица имеет смысл
Вариант включения каждого из режимов | Область действия метасимволов ^ и $ | Символы, которыми может быть 'точка'
(?s-m) | статья | любой знак
(?-sm) | статья | любой печатный знак
(?m-s) | строка | любой печатный знак
(?sm) | строка | любой знак
И там интересные вещи можно увидеть.
Можете пробовать.
 
  • Спасибо
Реакции: NNN5, Slx1 и LeonidB
Ого! сколько всего!))
Спасибо всем откликнувшимся!

Эх, жаль задача была очень уж простая, в конструкции типа:
Уважаемый Иван Иванович!
Уважаемая Светлана Ивановна!
Нужно было найти "женские" вторые имена (ну мы решили что это с окончанием на а и я) и заменить на Уважаемая

Я самостоятельно напрягся и выдал такое:
(Уважаемый) (\w+[а\я]\> )
Уважаемая $2

Вроде более менее сработало)

Еще раз всем большое спасибо!
 
уточнение

(Уважаемый) (\w+[а|я]\> )
Уважаемая $2
 
  • Спасибо
Реакции: RIKITIKI
Эх, жаль задача была очень уж простая
Ну да, а мы тут, оказывается, решали гораздо более сложную задачу '))' И даже тяжёлая артиллерия в лице Михаила Иванюшина подтянулась - что, впрочем, всем на пользу пошло! :)

"Всё, что может быть понято неправильно, обязательно будет понято неправильно". Один из законов Мёрфи :)
 
  • Спасибо
Реакции: Slx1
(Уважаемый) (\w+[^Илья][а|я]>\s)
Уважаемая $2
 
Последнее редактирование:
  • Спасибо
Реакции: Slx1