Как в JavaScript сделать регулярное вырожение соответствующее X, если перед X стоит Y?

/X(?=Y)/ соответствует X, eсли после X следует Y, а мне нужно чтобы Y было перед X. Т.е. Мне нужно такое регулярное выражение, которое соответствовало 'X' в строках "YX" или "abcYXde", но не соответствовало 'X' в строках "XY", "abYcXde" или "abXXY". Я думал, что таким регулярным вырожением будет \(?=Y)X\, но это почему-то не работает.


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

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

Используйте блок предварительного просмотра назад(?<=Y)X.

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

"Положительный блок предварительного просмотра назад" находит позицию в строке, сразу перед которой имеется совпадение определённых в данном блоке последовательности шаблонов.

"Отрицательный (негативный) блок предварительного просмотра назад" находит позицию в строке, сразу перед которой НЕТ совпадения определённых в данном блоке последовательности шаблонов.

Это значит, что (?<=Y)X не найдёт совпадения в YabcX. (?<=Y.*?)X найдёт такое совпадние, но тут нужно учитывать тот факт, что не все библиотеки регулярных выражений поддерживают блоки предварительного просмотра назад с шаблонами неопределённой длины (с квантификаторами типа *, ?, {8,}, +). .NET, PyPi regex, JGSoft Sofware, JavaScript ECMAScript 2018 (см. таблицу совместимости) поддерживают такой синтаксис.

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

→ Ссылка