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

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
Господа, помогите плиз сГРЕПом
Спасибо заранее!
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530
Проверяйте:
Код:
((^.+?а\b)(\w+|\h|[[:punct:]])+?)\K\b\w+а\b

Не по теме:
К сожалению, только такого монстра придумал :(
 
  • Спасибо
Реакции: Slx1

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530
А можно расшифровать как он ищет? )
Вах! Я чуть не сдох погиб смертию храбрых, придумывая этот ужас, а тут ещё и объяснять? '))'
1. В конце стоит \b\w+а\b - это слово, заканчивающееся на "а" (можно, наверно, было бы и \b\w*а\b - тогда бы и однобуквенные союзы "а" тоже вошли бы в поиск, если нужно).
2. \K - это положительный поиск назад (аналог (?<=__), который не всегда срабатывает.
3. Выражение ((^.+?а\b)(\w+|\h|[[:4)unct:]])+?) перед \K - это:
- (^.+?а\b) - любое выражение минимальной длины от начала абзаца до слова, заканчивающегося на "а", после которого стоит (\w+|\h|[[:рunct:]])+?) - то есть либо слово \w+ либо любой пробел \h, либо пунктуация, либо сочетание таковых.
 
Последнее редактирование:

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Господа, помогите плиз сГРЕПом
Спасибо заранее!
А что Вы дальше планируете делать с этим словом?
От этого порой зависит подход к решению задачи, поэтому лучше сразу обозначать цели.


Проверяйте:
Код:
((^.+?а\b)(\w+|\h|[[:punct:]])+?)\K\b\w+а\b

Не по теме:
К сожалению, только такого монстра придумал :(
У меня чуть короче получилось, но не уверена, что я учла все возможные варианты:
\r?^(\w+[[:punct:]]? )\K\w+а

В этом вопросе засада таится в стандартных ограничениях positive lookbehind. Это выражение не поддерживает повторение символов, что в целом разумно.
Поэтому выкрутиться можно через другое выражение:
\K
Всё, что находится до него будет использоваться для поиска совпадения, но не будет учитываться в найденном. Грубо говоря, это другая версия просмотра вперёд.
 
Последнее редактирование:

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
@LeonidB, Лёня, лучше использовать теги для кода, а то у тебя теперь греп-выражения дразнятся))))

А зачем ты одновременно указываешь и \w, и \b?
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530
@LeonidB, Лёня, лучше использовать теги для кода, а то у тебя теперь греп-выражения дразнятся))))
Я там уже на русскую букву "р" заменил, что, конечно, может ввести в конфуз '))' Но, надеюсь, оттуда копировать выражение не будут.
Лишние абзацы в своём тексте просто делать не хотел, а тут такая подлянка со стороны движка :)

А зачем ты одновременно указываешь и \w, и \b?
Согласен, в конце можно и так:
Код:
\K\w+а\b
 

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
У меня чуть короче получилось, но не уверена, что я учла все возможные варианты:
Да, не учла слова через дефис. Тогда вообще можно вот так сделать:
\r?^(\b.+? )\K\w+а
 
  • Спасибо
Реакции: Slx1 и LeonidB

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Ань, у меня 1-е слово с "а" на конце этим поиском ищется.
Хммм, странно. У меня второе.
1576150787247.png

Где же у нас расхождение?
 
  • Спасибо
Реакции: Slx1

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Согласен, в конце можно и так:
Код:
\K\w+а\b


А в конце зачем \b?
Интерес не праздный, пытаюсь понять, даёт ли это дополнительные гарантии и стоит ли так перестраховываться.
 

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Где же у нас расхождение?
Ааа, я поняла. По-разному прочитали запрос ТС.
Я вижу так, что надо искать просто второе слово в абзаце и выделять его только в случае, если оно заканчивается на «а».
У тебя подход, что мы ищем только слова, заканчивающиеся на букву «а» и среди них второе слово.
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Тогда так:
\r?^(\b.+?а\b[[:punct:]]? )\K\b.+?а\b
В целом тоже, что и у тебя выше, я уже просто упражняюсь для спортивного интереса.

Вообще редко использую \w, мне привычнее ограничивать рамками границ слова — \b. Вот и пытаюсь понять, в каких случаях правильнее использовать \w.

И в этот раз не уверена, что именно нужно ТС. Тот случай, когда краткость вопроса не всегда сестра таланту.
 
  • Спасибо
Реакции: Slx1

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
Мой вариант
^\S+\s+\K\S+а(?=\s)
Пытался учесть дефис во втором слове после буквы "а", типа "абра-кадабра, кадабра-абра сим-селабим"
А слеш отлавливать не стал - "Здрасте, г-н/г-жа Вставить имя", будет выделено как целое слово, вряд ли у ТС такое есть.
 
Последнее редактирование:
  • Спасибо
Реакции: Slx1, Linxy и LeonidB

iv-mi

15 лет на форуме
Сообщения
564
Реакции
380
Можно сделать обобщенный запрос
(?m)^([\S\h]+?а\b){2}\K[\S\h]+?\K\b[-\w]+а\b
тут в фигурных скобках сколько слов, кончающихся буквой а надо пропустить, прежде чем выделить такое слово.
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 470
Реакции
1 530

Не по теме:
О, какие маститые греповодники в эту тему набежали '))''cooll)'
 
  • Спасибо
Реакции: iv-mi

iv-mi

15 лет на форуме
Сообщения
564
Реакции
380
Да ладно, "маститые"... :)
Я там ещё и накосячил
вместо
(?m)^([\S\h]+?а\b){2}\K[\S\h]+?\K\b[-\w]+а\b
надо
(?m)^(.+?а\b){2}\K.+?\K\b[-\w]+а\b
Интересно, что тут в одном запросе подряд два одинаковых варианта просмотра: \K дважды используется.
Это не часто встречается.