^*$
匹配字符串“127.0.0.1”?使用Regex.IsMatch(“127.0.0.1”,“^ * $”);
使用Expresso,它不匹配,这也是我期望的.使用表达式^.* $确实匹配字符串,我也希望.
在技术上,^ * $应该匹配字符串/行的开头任何次数,后跟字符串/行的结尾.看来*被隐含地视为一个*.
我失踪了什么
编辑:
运行以下操作以查看问题的示例.
using System; using System.Text.RegularExpressions; namespace RegexFubar { class Program { static void Main(string[] args) { Console.WriteLine(Regex.IsMatch("127.0.0.1","^*$")); Console.Read(); } } }
我不希望有^ * $匹配我的字符串,我想知道为什么它匹配它.我会认为该表达式应该导致抛出异常,或至少不匹配.
EDIT2:
清除任何混乱.我没有写这个正则表达式,意图使它匹配“127.0.0.1”.我们的应用程序的用户输入表达式,并想知道为什么它不匹配字符串.看完之后,我无法提出一个解释,为什么它匹配 – 特别是不是因为Expresso和.NET似乎处理不同.
我猜这个问题是由于.NET实现而被回答,避免抛出异常,甚至认为它在技术上是一个不正确的表达式.但这真的是我们想要的吗?
解决方法
根据ISO / IEC 9945-2:1993标准,在POSIX standard中也有描述,它是破碎的.它是坏的,因为标准说,一个^字符后,一个星号根本没有什么特别的意义.这意味着“^ * $”实际上只能匹配一个字符串,而这个字符串是“*”!
引用标准:
The asterisk is special except when used:
- in a bracket expression
- as the first character of an entire BRE (after an initial ^,if any)
- as the first character of a subexpression (after an initial ^,if any); see BREs Matching Multiple Characters .
所以如果它是第一个字符(和^不算作第一个字符,如果存在)它没有什么特别的意义.这意味着在这种情况下,星号应该只匹配一个字符,那是一个星号.
更新
微软说
Microsoft .NET Framework regular
expressions incorporate the most
popular features of other regular
expression implementations such as
those in Perl and awk. Designed to be
compatible with Perl 5 regular
expressions,.NET Framework regular
expressions include features not yet
seen in other implementations,such as
right-to-left matching and on-the-fly
compilation.
资料来源: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正常工作. ^.* $匹配字符串,^ * $does not => .NET的正则表达式实现是坏的,它不像Perl 5那样工作,MS声称.