string str1 = Regex.Escape("[]");
        if (Regex.Match("[]", str1).Success)//这行改成if (Regex.Match("\\[]", str1).Success)一样可以
        {
            Console.WriteLine("ok");        }
        Console.Read();怎么会都匹配呢?

解决方案 »

  1.   

    匹别肯定还是有的先说一下原理,其实楼主那样写,用的是静态方法,显示声明就等价于下面的
    string str1 = Regex.Escape("[]");
    Regex reg = new Regex(str1);
    Match m = reg.Match("[]");
    if (m.Success)
    {
        Console.WriteLine("ok");
    }
    Console.Read(); 其实也就相当于
    Regex reg = new Regex("\\[]");
    这样写不易于理解,在.NET中有更简洁的写法
    Regex reg = new Regex(@"\[]");看到这里清楚了吗?
    由于“[]”是正则表达式中的元字符,具有特殊意义,在匹配其本身时,需要进行转义,“\[”也就是匹本“[”本身,而只有当“[”和“]”配对出现时,“]”才是元字符,由于“\[”已转义,所以此处的“]”也就只匹配“]”本身,其实也就相当于
    Regex reg = new Regex(@"\[\]");为什么是这样,因为Regex.Escape就是通过替换为转义码来转义最小的元字符集,也就是把元字符转义为普通文本字符
    Regex.Escape通常在动态生成正则时使用,以避免动态输入的元字符未经转义造成异常,比如
    string id = textBox1.Text;
    Regex reg = new Regex(@"(?is)<div id=""" + id + @"""[^>]*>.*?</div>");
    如果textBox1.Text中输入的是“a(b”,就会抛出下面的异常
    正在分析“(?is)<div id="a(b"[^>]*>.*?</div>”- ) 不足。
    string id = textBox1.Text;
    而如果使用Regex.Escape进行处理,就不会出现异常
    Regex reg = new Regex(@"(?is)<div id=""" + Regex.Escape(id) + @"""[^>]*>.*?</div>");
    处理后的正则形式为
    (?is)<div id="a\(b"[^>]*>.*?</div>
    言归正转,楼主的两种写法的区别,看看下面的程序执行结果就一目了然了
    string str1 = Regex.Escape("[]");
    Regex reg = new Regex(str1);
    Match m = reg.Match("[]");
    if (m.Success)
    {
        Console.WriteLine("ok");
        Console.WriteLine(m.Value);
        Console.WriteLine("匹配成功起始位置:" + m.Index);
    }
    Console.Read(); 
    /*--------输出---------
    ok
    []
    匹配成功起始位置:0
    */string str1 = Regex.Escape("[]");
    Regex reg = new Regex(str1);
    Match m = reg.Match("\\[]");
    if (m.Success)
    {
        Console.WriteLine("ok");
        Console.WriteLine(m.Value);
        Console.WriteLine("匹配成功起始位置:" + m.Index);
    }
    Console.Read(); 
    /*--------输出---------
    ok
    []
    匹配成功起始位置:1
    */[/code]