使用Regex.Escape时,正则表达式不匹配

时间:2014-02-07 00:09:42

标签: c# regex

对于下面的代码,我想:

strPattern.IsMatch("@!*()[]{}:?.,^%#$~`:;'_-@!*()[]{}/\\")

是真的,但我在正则表达式中放置的几乎所有内容都返回false

基本上我想要:

  • 首先剥离html(不允许使用html)
  • 上面的所有字符都应该匹配(这些是我允许的字符)
  • 其他一切都应该失败

    string escapedPattern1 = Regex.Escape("@!*()[]{}");
    string escapedPattern2 = Regex.Escape(":?.,^%#$~`:;'_-");
    string escapedPattern3 = Regex.Escape("@!*()[]{}");
    string escapedPattern4 = Regex.Escape(@"/\\");
    string stripped = securityHelper.StripHtml(value);
    string totalPattern = "0-9A-Za-z&" + escapedPattern1 + escapedPattern2 + escapedPattern3 + escapedPattern4;
    Regex strPattern = new Regex("^[" + totalPattern + "]*$");
    

1 个答案:

答案 0 :(得分:2)

Regex.Escape 处理“ - ”或“]”,对于字符类的内容通常不适合。在这种情况下,结果正则表达式将是错误的 1 ,因为它们都有其特殊含义。

我只是简化它并手动编写。我还删除了多余的字符并修复了其他各种问题。

 Regex p = new Regex(@"^[]0-9A-Za-z&[@!*(){}:?.,^%#$~`;'_/\\-]*$");
 p.IsMatch("@!*()[]{}:?.,^%#$~`:;'_-@!*()[]{}/\\")  // -> true
 p.IsMatch("Hello`World!")                          // -> true
 p.IsMatch("@<")                                    // -> false

注意:

  1. 要在字符类中使用],请将其写为[]..]或(逐字)[..\]..]
  2. 要在字符类中使用-,请将其写为[..-]或(逐字)[..\-..]
  3. 另外,“剥离HTML”是无关的。


    1 原始帖子中的结果正则表达式是

    ^[0-9A-Za-z&@!\*\(\)\[]\{}:\?\.,\^%\#\$~`:;'_-@!\*\(\)\[]\{}/\\\\]*$
    

    并且在虚拟占位符中替换后很容易发现错误。

    ^[characterclass]\{}:\?\.,\^%\#\$~`:;'_-@!\*\(\)\[]\{}/\\\\]*$