代码之家  ›  专栏  ›  技术社区  ›  Abe Miessler

验证程序引发错误

  •  1
  • Abe Miessler  · 技术社区  · 14 年前

    我的一页上有以下RegularExpressionValidator:

    <asp:RegularExpressionValidator id=“RegularExpressionValidator2”runat=“server”
    controlToValidate=“inkindTextBox”
    errormessage=“为‘现金’输入的值必须是数字格式。示例:500.00、500、$500、$50000或$500.00”
    validationExpression=“”(?n:(^?$?)?0!d)\{1,1,3}(?)=(?)<1 & gt;(?)<1>)。$)
    < /代码> 
    
    

    但是当它尝试验证时,它会从我的动态JS页面中抛出下面的错误。

    当我通过regex texter运行此regex时,它工作正常。我在这里做错什么了吗?

    <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" 
                                            ControlToValidate="InKindTextBox"
                                            ErrorMessage="The value entered for 'Cash' must be in a number format.   Examples: 500.00, 500, $500, $50,000 or $500.00" 
                                            ValidationExpression="(?n:(^\$?(?!0,?\d)\d{1,3}(?=(?<1>,)|(?<1>))(\k<1>\d{3})*(\.\d\d)?)$)" >
    

    但是当它尝试验证时,它会从我的动态JS页面中抛出下面的错误。

    alt text

    当我运行这个regexregex texter它工作得很好。我在这里做错什么了吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Abe Miessler    14 年前

    javascript使用的regexp语法与.NET不同。例如,请参见, this page .

    引自msdn's RegularExpressionValidator page :

    正则表达式验证 实施略有不同 在客户机上比在服务器上。论 客户端JScript正则表达式 使用语法。在服务器上, system.text.regularExpressions.regex 使用语法。自JScript Regular 表达式语法是 system.text.regularExpressions.regex 语法,建议使用JScript 正则表达式语法用于 以产生相同的结果 客户机和服务器。

    更新: 在许多语言(包括.NET和javascript)中,可以找到正则表达式风格的彻底比较。 here .

    更新2: 下面是一个应使用符合JScript的regex验证货币输入的regex:

                            <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
                                        ControlToValidate="CashTextBox" ValidationGroup="vld_Insert"
                                        ErrorMessage="The value entered for 'Cash' must be in a number format.  Examples: 5000, 5000.00, 5,000 or $5,000.00" 
                                        ValidationExpression="^\s*\$?\s*(?!\d{4,},)(\d|\d{1,3},(?=\d{3})(?!\d{4}))*(\.\d{1,2})?\s*$">
    
        2
  •  3
  •   Dave Aaron Smith    14 年前

    我觉得你的正则表达式太复杂了。我会用一些简单的东西,比如

    ^[1-9]\d*(\.\d*)?$
    

    这就是说没有前导0,小数点前至少有一个数字,可选的小数点后接更多的数字。

    编辑

    ^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$
    

    测试它

    var r = /^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$/;
    var shouldMatch = ["$30,000.00", "30,000.00", "9,000.00", "9000", "1", ".12"];
    var shouldntMatch = ["30,000000.00", "1.00c", "19,00.00", "$30,00"];
    function test1() {
      for (var i in shouldMatch) {
        if (!r.exec(shouldMatch[i])) {
          alert(shouldMatch[i]);
          return;
        }
      }
    }
    function test2() {
      for (var i in shouldntMatch) {
        if (r.exec(shouldntMatch[i])) {
          alert(shouldntMatch[i]);
          return;
        }
      }
    }
    test1();
    test2();