#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])
к (демонстрация).