Почему ^* $ соответствует “127.0.0.1”

Трудно заставить почту работать на локальном хосте по разным причинам, которые включают в себя неправильную настройку SMTP-сервера.

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

Одним из возможных решений может быть настройка PHP для использования внешнего SMTP-сервера, такого как Google, через файл конфигурации php (php.ini).

Лучшее решение, на мой взгляд, это получить общий хостинг или VPS и использовать его для разработки.

9
задан Mark S. Rasmussen 21 October 2008 в 11:50
поделиться

7 ответов

Ну, теоретически Вы правы, это не должно соответствовать. Но это зависит от того, как реализация работает внутренне. Большая часть regex impl. возьмет Ваш regex и разделит ^ от передней стороны (обращение внимания, которому это должно соответствовать от запуска строки) и $ полосы от конца (замечание, что это должно в конец строки), что перенесено, просто "*", и "*" самостоятельно допустимый regex. Реализация, которую Вы используете, просто неправильно расценивает, как обработать ее. Вы могли попробовать то, что происходит, если Вы заменяете "^* $" только с "*"; я предполагаю, что это будет также соответствовать всему. Это походит на обработки реализации единственная звездочка как a ".*".

Согласно ISO/IEC 9945-2:1993 стандарт, который также описан в стандарте POSIX, он повреждается. Это повреждается, потому что в стандарте говорится, что после ^ символа, звездочка не имеет никакого особого значения вообще. Это означает "^*, $" должен на самом деле только соответствовать единственной строке, и эта строка "*"!

Заключить стандарт в кавычки:

Звездочка является особенной кроме тех случаев, когда используемый:

  • в выражении скобки
  • как первый символ всего BRE (после начальной буквы ^, если таковые имеются)
  • как первый символ подвыражения (после начальной буквы ^, если таковые имеются); см., что BREs Соответствует Нескольким Символам.

Таким образом, если это - первый символ (и ^ не рассчитывает как первый символ, если существующий) это не имеет никакого особого значения. Это означает в этом случае, что звездочка должна только соответствовать одному символу, и это - звездочка.


Обновление

Microsoft заявляет

Регулярные выражения Microsoft.NET Framework включают самые популярные функции других реализаций регулярного выражения, такие как те, которые в Perl и awk. Разработанный, чтобы быть совместимыми с Perl 5 регулярных выражений, регулярные выражения Платформы.NET включают функции, еще не замеченные в других реализациях, таких как справа налево соответствие и непрерывная компиляция.

Источник: http://msdn.microsoft.com/en-us/library/hs600312.aspx

Хорошо, давайте протестируем это:

# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^.*$)/)[0]),"\n";'
-> 127.0.0.1
# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^*$)/)[0]),"\n";'
->

Нет, это не делает. Perl работает правильно. ^.* $ соответствует строке, ^* $ не делает =>, regex реализация.NET повреждается, и это не работает как Perl 5 требованиями MS.

27
ответ дан 4 December 2019 в 06:31
поделиться

Звездочка (*) соответствует предыдущему НУЛЮ элемента ИЛИ БОЛЬШЕ раз. Если Вы хотите один или несколько, используйте + оператор вместо *.

Вы просите, чтобы это соответствовало дополнительному запуску строкового маркера и концу строкового маркера. Т.е. если мы опускаем запуск строкового маркера, Вы только ищете конец строкового маркера..., который будет соответствовать любой строке!

Я действительно не понимаю то, что Вы пытаетесь сделать. Если Вы могли бы дать нам больше информации затем, возможно, я мог бы сказать Вам, что необходимо было сделать :)

9
ответ дан 4 December 2019 в 06:31
поделиться

Если Вы пробуете

Regex.Match("127.0.0.1", "^*1$")

Вы будете видеть, что это также соответствует. Соответствие. Индексное свойство имеет значение 8, означая, что оно соответствовало последнему '1', не первое. Это имеет смысл, потому что "^*" будет соответствовать нулю или больше начала строк и существует нулевое начало строки прежде '1'.

Думайте о пути "a*1, $" соответствовал бы, потому что существует не перед "1$". Так "a* $" соответствовал бы концу строки, как Ваш пример делает.

Между прочим, документы MSDN не упоминают '*' никогда соответствие просто '*' кроме тех случаев, когда завершенный как '\* '. И '*' отдельно будет выдавать исключение, не соответствовать'* '.

2
ответ дан 4 December 2019 в 06:31
поделиться

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

0
ответ дан 4 December 2019 в 06:31
поделиться

Используя RegexDesigner, я вижу, что он соответствует на 'пустом' маркере после '127.0.0.1'. Кажется, что, потому что Вы не указали маркер и плюс нуль соответствий или больше раз, он соответствует на 'пустом' маркере.

Следующий regex должен работать:

^+$
-1
ответ дан 4 December 2019 в 06:31
поделиться

POSIX regex стандарт действительно стар и ограничен. Несколько инструментов, который все еще следует за ним сегодня, такие как grep, sed и друзья, находятся главным образом на оболочке unix/linux. Perl и PCRE два, очень расширенные разновидности, в которых все еще не сохраняется почти ничто упомянутое в стандарте POSIX.

http://www.regular-expressions.info/refflavors.html

В PCRE и Perl, обработках механизма ^ и $ как маркеры, которые соответствуют началу и концу строки (или строка, если многострочный флаг установлен). * просто повторения ^ нуль маркера или больше раз (в этом случае, точно нулевые времена). Механизм таким образом только ищет конец исходной строки, которая соответствует любой строке.

0
ответ дан 4 December 2019 в 06:31
поделиться

Недопустимый regexp независимо, что Вы хотите записать, наиболее вероятен не это.

Вы пишете: "$ ^* должен соответствовать началу строки/строки любое количество раз, сопровождаемое окончанием строки/строки", которая подразумевает, что Вы хотите мультилинию regexps, но Вы забываете, что строка не может запуститься дважды без промежутка конца строки.

Кроме того, что Вы спрашиваете в своих требованиях, на самом деле соответствует "127.0.0.1" :) "^" не является переводом строки / возврат каретки, но также и начинание строки, и "$" не является просто новой строкой, но и концом строки.

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

Надежда это разъясняет что-то :)

0
ответ дан 4 December 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: