В (?=abc)def
захват (?=abc)
является нулевой шириной и не перемещает курсор вперед в строке ввода после успешного совпадения. Эта конструкция просто говорит, глядя вперед на следующие три символа, чтобы увидеть, являются ли они abc
, если они затем проверяют, являются ли эти же символы def
. На этом этапе матч терпит неудачу.
Вам нужно понять, как работает двигатель регулярного выражения, чтобы завершить матч. Рассмотрим вашу строку ввода abcdef
и ваше регулярное выражение abc(?=def)
. Двигатель запускается путем сопоставления a
, затем перемещает курсор внутри входной строки на следующий символ и пытается сопоставить b
, потому что курсор во входной строке находится на b
, совпадение получается успешно. Затем движок перемещает курсор внутри входной строки и пытается совместить c
и потому, что курсор находится во входной строке на c
, совпадение завершается успешно, а курсор во входной строке снова перемещается в следующий символ. Теперь двигатель встречает (?=def)
, в этот момент двигатель просто смотрит вперед, чтобы увидеть, будут ли следующие три символа, из которых находится курсор во входном скрине, на самом деле def
, не перемещая курсор, который они есть, и совпадение завершается успешно.
Теперь рассмотрим строку ввода xyz
и регулярное выражение x(?=y)Z
. Механизм регулярных выражений помещает курсор в первую букву в строке ввода и проверяет, является ли это x
и находит, что x
, поэтому он перемещает курсор на следующий символ в строке ввода. Теперь он смотрит вперед, чтобы увидеть, является ли следующий символ y
, который он есть, но движок не перемещает введенное текстовое курсорное предисловие, поэтому курсор в тексте ввода остается на y
. Затем двигатель смотрит, находится ли курсор на букве z
, но поскольку курсор во входном тексте по-прежнему находится на букве y
, совпадение не выполняется.
Вы можете прочитать намного больше о положительных и отрицательных lookaheads на http://www.regular-expressions.info/lookaround.html
Возможно, вы хотите вместо этого использовать '(ab: abc) def', который использует не захватывающую группу вместо положительного вида. – DaoWen
@ DaoWen Нет, я уже пробовал это ... try '" abcdef ".replace (/ (?: abc) def /," ")' он заменяет целую строку – Zaffy