c# – 为什么^ * $匹配“127.0.0.1”
我不明白,为什么以下正则表达式:
^*$ 匹配字符串“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: 我猜这个问题是由于.NET实现而被回答,避免抛出异常,甚至认为它在技术上是一个不正确的表达式.但这真的是我们想要的吗? 解决方法
那么理论上你是对的,不应该匹配.但这取决于实现内部的工作.大多数正则表达式.将从你的正则表达式和从前面剥去^(注意它必须从字符串的开始匹配),并从结尾(注意到它必须到字符串的末尾),剩下的只是“*” “和”*“是一个有效的正则表达式.您正在使用的实现只是错误的如何处理它.你可以尝试如果用“*”代替“^ * $”,会发生什么?我想这也会匹配一切.看起来像执行一个像“*”一样的星号.
根据ISO / IEC 9945-2:1993标准,在POSIX standard中也有描述,它是破碎的.它是坏的,因为标准说,一个^字符后,一个星号根本没有什么特别的意义.这意味着“^ * $”实际上只能匹配一个字符串,而这个字符串是“*”! 引用标准:
所以如果它是第一个字符(和^不算作第一个字符,如果存在)它没有什么特别的意义.这意味着在这种情况下,星号应该只匹配一个字符,那是一个星号. 更新 微软说
资料来源: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声称. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |