Я работаю над своей собственной библиотекой JavaScript для поддержки новых метасимволов и функций для регулярных выражений, и я хотел бы найти случай, когда [^xy]
не эквивалентен (?!x).
(или, более конкретно, (?:(?!x|y).)
).
Возьмем пример текста: "abc\n"
Скажем, я хочу эмулировать регулярное выражение Perl: /\A.{3}\Z/s
С флагом singleline регулярное выражение JavaScript должно быть эквивалентно: /^[\s\S]{3}\n*$(?!\s)/
(\A
становится ^
, .
становится [\s\S]
, \Z
становится \n*$(?!\s)
)
Теперь /^.{3}$/
завершится с ошибкой, но /^[\s\S]{3}\n*$(?!\s)/
будет захватывать "abcabc" (так же, как и регулярное выражение Perl)
Так как \Z
содержит больше, чем просто метасимвол, эмуляция [^\Z]
представляется сложнее.
Возьмем пример текста: "abcabc\n"
Предложенное регулярное выражение JavaScript для регулярного выражения Perl /.{3}[^\Za]/g
будет .{3}(?:(?!\n*$(?!\s)|a).)/g
Оба будут соответствовать "bcab"
Итак, наконец, я снова задаю вопрос. Есть ли случай, когда [^xy]
не эквивалентен (?:(?!x|y).)
с таким сценарием, возможно, в более сложном регулярном выражении, где lookahead изменит сценарий?