代码之家  ›  专栏  ›  技术社区  ›  Dan Herbert

为什么在这个正则表达式中要转义左括号?

  •  4
  • Dan Herbert  · 技术社区  · 17 年前

    我正在使用一个HTML清理白名单代码,可在此处找到:
    http://refactormycode.com/codes/333-sanitize-html

    <img 标签检查

    if (tagname.StartsWith("<font"))
    {
        // detailed <font> tag checking
        // Non-escaped expression (for testing in a Regex editor app)
        // ^<font(\s*size="\d{1}")?(\s*color="((#[0-9a-f]{6})|(#[0-9a-f]{3})|red|green|blue|black|white)")?(\s*face="(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)")?\s*?>$
        if (!IsMatch(tagname, @"<font
                                (\s*size=""\d{1}"")?
                                (\s*color=""((#[0-9a-f]{6})|(#[0-9a-f]{3})|red|green|blue|black|white)"")?
                                (\s*face=""(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)"")?
                                 \s*?>"))
        {
            html = html.Remove(tag.Index, tag.Length);
        }
    }
    

    除了上述条件外,我的代码与我链接到的页面中的代码几乎相同。当我尝试在C#中测试这一点时,它抛出一个异常,并说“ Not enough )'s

    我是否在正则表达式中遗漏了导致括号转义的内容?我需要做什么来解决这个问题?


    经过多次尝试和错误,我记得 # # 性格如果其他任何人遇到相同的问题,我已经包括了我的修复(只是逃避问题)

    if (tagname.StartsWith("<font"))
    {
        // detailed <font> tag checking
        // Non-escaped expression (for testing in a Regex editor app)
        // ^<font(\s*size="\d{1}")?(\s*color="((#[0-9a-f]{6})|(#[0-9a-f]{3})|red|green|blue|black|white)")?(\s*face="(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)")?\s*?>$
        if (!IsMatch(tagname, @"<font
                                (\s*size=""\d{1}"")?
                                (\s*color=""((\#[0-9a-f]{6})|(\#[0-9a-f]{3})|red|green|blue|black|white)"")?
                                (\s*face=""(Arial|Courier\sNew|Garamond|Georgia|Tahoma|Verdana)"")?
                                 \s*?>"))
        {
            html = html.Remove(tag.Index, tag.Length);
        }
    }
    
    4 回复  |  直到 17 年前
        1
  •  5
  •   Christian C. Salvadó    17 年前

    IsMatch方法正在使用该选项 RegexOptions.IgnorePatternWhitespace ,这允许您将注释放入正则表达式中,因此您必须替换#chatactor,否则它将被解释为注释。

    if (!IsMatch(tagname,@"<font(\s*size=""\d{1}"")?
        (\s*color=""((\#[0-9a-f]{6})|(\#[0-9a-f]{3})|red|green|blue|black|white)"")?
        (\s*face=""(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)"")?
        \s?>"))
    {
        html = html.Remove(tag.Index, tag.Length);
    }
    
        2
  •  2
  •   Robert Gamble    17 年前

    我看不出正则表达式有什么明显的问题。我会尝试通过删除正则表达式的片段来隔离问题,直到问题消失,然后关注导致问题的部分。

        3
  •  1
  •   Marc Gravell    17 年前

    例外

    还有,你喜欢什么 IsMatch Regex.IsMatch

    [更新]问题是OP的示例代码没有显示他们正在使用IgnorePatternWhitespace regex选项;这个选项不起作用;如果没有此选项(如所示),代码就可以了。

        4
  •  1
  •   Nimantha Thatkookooguy    6 年前

    Regex Designer . 它是测试.NET正则表达式的一个伟大的免费工具。

    我不确定这个正则表达式是否能满足您的要求,因为它取决于与正则表达式中的属性匹配的属性的顺序。比如说 face="Arial" size="5" 然后 face=

    您的正则表达式中存在一些转义问题。你需要逃离你的恐惧 " 具有 \ 你需要逃离你的恐惧 # 具有 \ 你需要使用 \s RegexOptions.IgnorePatternWhitespace RegexOptions.IgnoreCase options .

    <font
    (\s+size=\"\d{1}\")?
    (\s+color=\"((\#[0-9a-f]{6})|(\#[0-9a-f]{3})|red|green|blue|black|white)\")?
    (\s+face=\"(Arial|Courier\sNew|Garamond|Georgia|Tahoma|Verdana)\")?
    

    这个 字符是导致异常的原因,有点误导性(缺失)消息。