Ваш худший кошмар, или простой regex, который удивит даже опытных программистов.
re.match(r"^abc$", "abc\n") # python
/^abc$/.test("abc\n") // Javascript
preg_match("/^abc$/", "abc\n"); // PHP
Не читайте дальше, попробуйте угадать какой вывод будет у каждого из вариантов?
False?
True ?
Правильный ответ:
False True False
Живите с этим :)
Всё дело в том, что в PCRE $ означает не "конец строки", а "конец строки, или позиция перед \n в конце строки". А в ECMAScript это не так.
Лично я думал, что должно быть False, но регулярные выражения продолжают меня удивлять спустя много лет.
Правильный regex для точного совпадения с концом строки:
re.match(r"^abc\Z", "abc\n")
// javascript идеален, нечего исправлять :)
preg_match("/^abc\p/", "abc\n")
== false
