Попытка исключить совпадение, когда оно окружено с обеих сторон определенной строкой

#javascript #regex #string-matching

Вопрос:

То, что я хочу сделать, — это изменить регулярное выражение (JS-вариант), чтобы оно не совпадало, если шаблону предшествует и за ним следует одна и та же строка.

В качестве простой аналогии, скажем, я хочу сопоставить все экземпляры n , которым не предшествует и за которыми не следует e . Так, например, регулярное выражение не должно совпадать с n in alkene , но оно все равно должно совпадать с n in pen или nest , которые имеют только e непосредственно примыкающие n с одной стороны, а не с обеими.

Большинство старых потоков, которые я видел, пытаясь найти ответ, в основном говорят: «просто используйте отрицательные поисковые запросы», но проблема в том, что (?<!e)n(?!e) они не совпадают ни с одним из этих входных данных, потому что поисковый запрос и поисковый запрос обрабатываются механизмом регулярных выражений отдельно, поэтому он считает, что достаточно любого условия, чтобы исключить совпадение.

(Настоящее регулярное (?<!¸ª)()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)(?!¸ª) выражение , и оно не соответствует ɣʷ t͡ʃe:h₁dɣʷo¸ªh₂¸ª , но это делает проблему намного сложнее объяснить, чем это должно быть)

Как изменить регулярное выражение, чтобы исключить шаблоны только в том случае, если они вложены?

Ответ №1:

(?<!b)a(?!b) Шаблон здесь должен быть заменен на (?<!b(?=ab))a или a(?!(?<=ba)b) . Смысл в том, чтобы вызвать обратный внешний вид или внешний вид из внешнего вида или внешнего вида.

Посмотрите, как вы исправили шаблон (без какой-либо оптимизации), где я взял внешний вид , вставил его внутрь внешнего вида после ª , перевернул внешний вид (т. Е. Сделал его положительным) и добавил весь шаблон перед ¸ª тем, как в внешний вид, чтобы иметь возможность перейти к правой руке ¸ª :

 (?<!¸ª(?!(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)¸ª))()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)
 

Или, если вы поместите взгляд сзади в lookahead:

 ()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)(?!(?<=¸ª(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a))¸ª)
 

Смотрите демонстрационную версию регулярного выражения (и демонстрационную версию регулярного выражения № 2).

Всякий раз, когда ваш шаблон прост, лучше не повторять шаблон в поисковых системах, обычно вы можете просто использовать . или .{x} где x указано количество символов, которым может соответствовать ваша потребляющая часть шаблона. Здесь неясно, скольким символам на самом деле может соответствовать шаблон, вы , вероятно, можете использовать (?<!¸ª(?!.{1,2}¸ª))()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a) , но у меня нет никаких крайних случаев для проверки.

Дальнейшее усиление этого может привести (?<!¸ª(?!.{1,2}¸ª))()(ɣʷ|[hr]₂|r₃|w|j)([eoøɑiɚyua]) к (демонстрация).