Ну, теоретически вы правы, это не должно совпадать. Но это зависит от того, как реализация работает внутри. Большинство регулярных выражений возьмем ваше регулярное выражение и удалим ^ с фронта (принимая во внимание, что оно должно совпадать с начала строки) и убрав $ с конца (отметив, что оно должно совпадать с концом строки), осталось только "* "и" * "само по себе является действительным регулярным выражением. Реализация, которую вы используете, просто неверна в отношении того, как с ней справиться. Вы можете попробовать, что произойдет, если вы замените «^ * $» просто на «*»; Я думаю, это также будет соответствовать всем. Похоже, что реализация обрабатывает одну звездочку как ". *".
В соответствии со стандартом ISO / IEC 9945-2: 1993, который также описан в стандарте POSIX , он нарушен. Он нарушен, потому что стандарт гласит, что после символа ^ звездочка вообще не имеет никакого особого значения. Это означает, что «^ * $» должен фактически соответствовать только одной строке, и эта строка будет "*" !
Чтобы процитировать стандарт:
Звездочка специальная, кроме случаев, когда она используется:
- в выражении в скобках
- как первый символ всего BRE (после начального ^, если есть)
- как первый символ подвыражения (после начального ^, если есть); см. BRE, соответствующие нескольким символам.
Так что, если это первый символ (и ^ не считается первым символом, если присутствует), он не имеет особого значения. Это означает, что в этом случае звездочка должна соответствовать только одному символу, и это звездочка.
Обновление
Microsoft говорит
Microsoft .NET Framework обычный
выражения включают в себя наиболее
популярные особенности других регулярных
реализации выражений, таких как
те, в Perl и awk. Предназначен для
совместим с Perl 5 регулярно
выражения .NET Framework регулярные
выражения включают функции еще
видел в других реализациях, таких как
сопоставление справа налево и на лету
сборник.
Источник: 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 работает правильно. ^. * $ соответствует строке, ^ * $ not => Реализация регулярного выражения в .NET не работает и не работает как Perl 5, как утверждает MS.