c# – 为什么^ * $匹配“127.0.0.1”

前端之家收集整理的这篇文章主要介绍了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:
清除任何混乱.我没有写这个正则表达式,意图使它匹配“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声称.

猜你在找的C#相关文章