Являются ли ^ $ и $ ^ в регулярных выражениях PHP одинаковыми? - PullRequest
9 голосов
/ 17 июня 2011

Почему оба эти регулярных выражения успешно совпадают?

if(preg_match_all('/$^/m',"",$array))
  echo "Match";

if(preg_match_all('/$^\n$/m',"\n",$array))
  echo "Match";

Ответы [ 4 ]

11 голосов
/ 17 июня 2011

$ и ^ - метасимволы нулевой ширины.В отличие от других метасимволов, таких как ., которые соответствуют одному символу за раз (если не используются с квантификаторами), они на самом деле не соответствуют буквальным символам.Вот почему ^$ соответствует пустой строке "", хотя регулярное выражение (без разделителей) содержит два символа, а пустая строка содержит ноль.

Не имеет значения, что пустая строка не содержит символов,У него все еще есть начальная точка и конечная точка, и поскольку это пустая строка, оба находятся в одном месте.Поэтому независимо от того, какой порядок или число ^ и $ вы используете, все их перестановки должны совпадать с пустой строкой.


Ваш второй случай немного сложнее, но применяются те же принципы.

Модификатор m (PCRE_MULTILINE) просто указывает механизму PCRE вводить всю строку за один раз, независимо от перевода строки, но строка по-прежнему содержит «несколько строк».Затем он смотрит на ^ и $ как «начало строки» и «конец строки» соответственно.

Строка "\n" по сути логически разделена на три части: "", "\n" и "" (поскольку новая строка окружена пустотой ... звучит поэтично).

Затем следуют следующие совпадения:

  1. Первый пустойСтрока соответствует начальному $^ (как я объяснил выше).

  2. \n соответствует тому же \n в вашем регулярном выражении.

  3. Вторая пустая строка соответствует последнему $.

И вот как ваш второй случай приводит к совпадению.

3 голосов
/ 17 июня 2011

Нет, это не так. На самом деле, выражение $^ никогда не должно совпадать, потому что $ символизирует конец строки, тогда как ^ представляет начало. Но, как мы знаем, конец не может предшествовать началу строки:)

^$ должно соответствовать пустой строке, и только этому.

Метасимвол «начало строки» (^) совпадает только в начале строки, а метасимвол «конец строки» ($) - только в конце строки, [...]

Из справочных страниц PCRE

Обратите внимание, что при добавлении модификатора PCRE_MULTILINE $ становится EOL, а ^ становится BOL, он будет совпадать (спасибо netcoder за указание на это). Тем не менее, я лично не буду использовать его.

1 голос
/ 17 июня 2011

Regex.IsMatch ("", "$^") совпадений в C #, также.Поскольку это пустая строка, размер отсутствует.При индексе -1 это одновременно конец и начало строки.Хороший вопрос!

0 голосов
/ 17 июня 2011

В регулярном выражении ^ соответствует началу строки, а $ соответствует концу строки.

Следовательно, регулярное выражение /^$/ будет успешно совпадать с полностью пустой строкой (и ничем иным).

/$^/ не будет ничего совпадать, так как логически у вас не может быть конца строки до ее начала.

...