regulareexpression validator的行为与UnitTest RegEx不同

本文关键字:UnitTest RegEx 不同 validator regulareexpression | 更新日期: 2023-09-27 18:14:54

我为我们的需要创建了一个RegEx -写了我的UnitTest,在它通过后,我想升级我的FrontEnd到新的RegEx -但是RequiredFieldValidator不知怎么的不匹配与UnitTest完全相同的字符串

下面是Unittest可以顺利通过的例子:

[TestMethod]
    public void BasicTest()
    {
        using (ShimsContext.Create())
        {
            var basicUnicodeRegEx = new Regex(@"^(?:(?:'p{IsBasicLatin}|'p{IsLatin-1Supplement}|'p{IsLatinExtended-A}|'p{IsLatinExtended-B}|'p{IsIPAExtensions}|['u0302'u030C]|'p{IsLatinExtendedAdditional}){2,}[*]?)$");
            var isMatchString = "Floriân-D̂îétrich Wäßterh@gen 1823*";
            var IsNotMatchString = "べξぺき";
            Assert.IsTrue(basicUnicodeRegEx.IsMatch(isMatchString));
            Assert.IsFalse(basicUnicodeRegEx.IsMatch(IsNotMatchString));
        }
    }

这是我的ASP控件它不喜欢完全相同的字符串甚至不喜欢基本的a - z字符串:

 <asp:TextBox runat="server" ID="edtNachname"></asp:TextBox>
<asp:RegularExpressionValidator ID="rev_Nachname" runat="server" ControlToValidate="edtNachname" ErrorMessage="nope" ValidationExpression="^(?:(?:'p{IsBasicLatin}|'p{IsLatin-1Supplement}|'p{IsLatinExtended-A}|'p{IsLatinExtended-B}|'p{IsIPAExtensions}|['u0302'u030C]|'p{IsLatinExtendedAdditional}){2,}[*]?)$">
                        </asp:RegularExpressionValidator>

这是怎么回事?: o

regulareexpression validator的行为与UnitTest RegEx不同

似乎RegularExpressionValidator不支持NamedBlocks (ref: https://msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx#SupportedNamedBlocks)

更改为UniCode范围-在这种情况下:

^(?:['u0000-'u02AF]|['u0302'u030C]|['u1E00-'u1EFF]){2,}$

-工作正常

有两个重要的区别:

  • 验证器使用javascript在浏览器中进行验证-因此您受到javascript中的正则表达式引擎的限制。
  • 验证器仅在整个字符串匹配时才匹配,就好像模式被^$包围一样。
关于你的'p{IsBasicLatin},我怀疑第一点是你的问题。您可以将该验证设置为仅在服务器端使用. net正则表达式引擎,但这确实需要回发。