Почему это регулярное выражение не проверяется таким же образом в PHP? - PullRequest
2 голосов
/ 23 июля 2011

, когда я пытаюсь использовать preg_match со следующим выражением: /.{0,5}/, оно все равно соответствует строке длиной более 5 символов.Тем не менее, он работает правильно при попытке онлайнового сопоставления регулярных выражений

Ответы [ 2 ]

6 голосов
/ 23 июля 2011

Сайт, на который вы ссылаетесь, myregexp.com, ориентирован на Java.

Java имеет специальную функцию для сопоставления точного шаблона без необходимости использования якорных символов.Это функция, которую использует myregexp.com.

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

Это означает, что без привязок ваш шаблон будет соответствовать любой строке,любой длины, потому что, какой бы ни была строка, она будет где-то содержать совпадение «от нуля до пяти любого символа».

Так что в PHP, Perl и практически любом другом языке вам нужен ваш шаблончтобы выглядеть так:

/^.{0,5}$/

Объяснив все это, я хотел бы сделать одно заключительное замечание: этот конкретный паттерн на самом деле не обязательно должен быть регулярным выражением - вы можете достичь того же с помощью strlen().Кроме того, символ точки в регулярном выражении может работать не совсем так, как вы ожидаете: обычно он соответствует почти любому символу;некоторые символы, в том числе символы новой строки, по умолчанию исключаются, поэтому, если ваша строка содержит пять символов, но один из них - новая строка, вы не сможете выполнить регулярное выражение, если вы ожидаете, что оно пройдет.Имея это в виду, strlen() будет более безопасным вариантом (или mb_strlen(), если вы ожидаете иметь символы Юникода).

Если вам нужно сопоставить любой символ в регулярном выражении, иповедение точки по умолчанию недостаточно хорошее, есть два варианта: один из них - добавить модификатор s в конце выражения (т.е. он становится /^.{0,5}$/s).Модификатор s указывает регулярному выражению включить символы новой строки в точку «любой символ».

Другой вариант (который полезен для языков, не поддерживающих модификатор s), заключается в использованиивыражение и его отрицание вместе в символьном классе - например, [\s\S] - вместо точки.\s соответствует любому символу пробела, а \S является отрицательным значением \s, поэтому любой символ не соответствует \s.Так что вместе в классе персонажей они соответствуют любому персонажу.Он более длинный и менее читаемый, чем точка, но в некоторых языках это единственный способ убедиться в этом.

Подробнее об этом можно узнать здесь: http://www.regular -expressions.info / dot.html

Надеюсь, это поможет.

4 голосов
/ 23 июля 2011

Вам нужно закрепить его ^$. Эти символы соответствуют началу и концу строки соответственно, поэтому между началом и концом должно быть 0-5 символов. Если якоря не указаны, они будут совпадать в любом месте строки, поэтому они могут быть длиннее.

/^.{0,5}$/

Для лучшей читабельности я бы, вероятно, также заключил . в (), но это отчасти субъективно.

/^(.){0,5}$/
...