【问题标题】:Backslash escaping in RegularExpressionValidator正则表达式验证器中的反斜杠转义
【发布时间】:2010-03-16 09:49:12
【问题描述】:

我需要确保输入值至少包含一个点,所以我使用了以下内容:

<asp:RegularExpressionValidator runat="server" 
ControlToValidate="MyInput" Text="*" 
ErrorMessage="must contain at least one dot" 
ValidationExpression="\.+" />

那是行不通的。通过检查页面源,我可以看到 ASP.NET 转义了反斜杠字符,因此在 java 脚本中它看起来像 "\\.+"。为什么会这样做,我如何防止 RegularExpressionValidator 转义它?

【问题讨论】:

    标签: asp.net regex reg-expressionvalidator


    【解决方案1】:

    如果您想检查输入是否至少包含一个点,则您的表达式不正确。它仅匹配仅由点组成的输入。

    你应该使用

    .*\..*
    

    如果转义也被证明是一个问题,请使用[.] 而不是\.

    请注意,RegularExpressionValidator 不会验证空字段。使用 RequiredFieldValidator 来执行此操作。

    【讨论】:

    • 您确定RegularExpressionValidator 隐式搜索字符串的开头和结尾吗? AFAIK 它确实,因此\. 应该是一个足够的模式。
    • 我刚刚测试过了。确实如此。至少我在我的网站上使用的那个。
    • 谢谢!这意味着默认的 JS 正则表达式选项与 .NET Regex 类不同,因为后者可以正常工作。这很奇怪——如果我们禁用了 JS,RegularExpressionValidator 应该使用服务器端检查(即 Regex 类),不是吗?
    • 那么我是正确的。但是到底为什么要以这种方式实施控制呢? (反问的问题,我不希望你知道答案。)
    • @Jørn:我猜这个控件是用来检查邮政编码、信用卡号码等的。您需要更频繁地进行完全匹配。
    【解决方案2】:

    双重转义是必要的,因为反斜杠用于 JavaScript 和正则表达式中的转义序列。一个快速测试来说明这一点:

    alert('42'.match("\d"));     // no match
    alert('42'.match("\\d"));    // match
    

    但这并不能解决您的问题。故障排除第一步:将验证表达式更改为a。它不会在“foo”上失败并通过“bar”吗?如果不是,那么您的页面上还有其他问题 - 可能是不相关的 JavaScript 错误导致验证代码被跳过。

    稍微偏离主题:您的验证表达式可以修剪为\.(没有加号),因为您真的只关心匹配单个点。

    【讨论】:

    • 单个反斜杠也可以:alert('12.3'.match("\."));
    • @frogbot:你是对的。我更新了一个更好的示例。
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2022-07-07
    • 2012-02-25
    • 2011-08-29
    • 2012-06-01
    相关资源
    最近更新 更多