Регулярное выражение дает не ожидаемый результат

По задумке регулярное выражение /[\s][\wА-Яа-яЁё]{1,2}[\s]/gm должно находить одно или два символа, обрамленных пробелом или переводом строки. Но в результате в выборку попадает не все. Буду благодарен за помощь!

https://regex101.com/r/Ic0hVy/1


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

У вас в тексте есть совпадения, которые идут один за другим. Первый пробельный символ каждого последующего совпадения находится с помощью последнего \s.

Вам нужно использовать проверку на наличие символа, блок предварительного просмотра:

\s[\wА-Яа-яЁё]{1,2}(?!\S)

или

(?<!\S)[\wА-Яа-яЁё]{1,2}(?!\S)

См. этот пример работы выражения или этот.

(?!\S) - блок предварительного просмотра вперёд, требует наличия пробельного символа или конца строки сразу после текущей позиции. (?<!\S) - блок предварительного просмотра назад, требует наличия пробельного символа или начала строки сразу после текущей позиции (пока не поддерживается в FireFox и IE/Edge).

→ Ссылка