$
и ^
- метасимволы нулевой ширины.В отличие от других метасимволов, таких как .
, которые соответствуют одному символу за раз (если не используются с квантификаторами), они на самом деле не соответствуют буквальным символам.Вот почему ^$
соответствует пустой строке ""
, хотя регулярное выражение (без разделителей) содержит два символа, а пустая строка содержит ноль.
Не имеет значения, что пустая строка не содержит символов,У него все еще есть начальная точка и конечная точка, и поскольку это пустая строка, оба находятся в одном месте.Поэтому независимо от того, какой порядок или число ^
и $
вы используете, все их перестановки должны совпадать с пустой строкой.
Ваш второй случай немного сложнее, но применяются те же принципы.
Модификатор m
(PCRE_MULTILINE
) просто указывает механизму PCRE вводить всю строку за один раз, независимо от перевода строки, но строка по-прежнему содержит «несколько строк».Затем он смотрит на ^
и $
как «начало строки» и «конец строки» соответственно.
Строка "\n"
по сути логически разделена на три части: ""
, "\n"
и ""
(поскольку новая строка окружена пустотой ... звучит поэтично).
Затем следуют следующие совпадения:
Первый пустойСтрока соответствует начальному $^
(как я объяснил выше).
\n
соответствует тому же \n
в вашем регулярном выражении.
Вторая пустая строка соответствует последнему $
.
И вот как ваш второй случай приводит к совпадению.