RegularExpressionValidator的行为与UnitTest RegEx不同

时间:2016-10-26 09:41:47

标签: c# asp.net regex

我为我们的需求创建了一个RegEx - 编写了我的UnitTest,在它通过后我想将我的FrontEnd升级到新的RegEx - 但是RequiredFieldValidator SomeHow与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>

这里发生了什么? :○

2 个答案:

答案 0 :(得分:0)

看起来像RegularExpressionValidator并不支持NamedBlocks(参考:https://msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx#SupportedNamedBlocks

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

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

- 工作正常

答案 1 :(得分:0)

有两个重要的区别:

  • 验证程序使用javascript在浏览器中进行验证 - 因此您受到javascript中正则表达式引擎的限制。
  • 验证器仅在整个字符串匹配时匹配,就像模式被^$包围一样。

对于\p{IsBasicLatin},我怀疑第一点是你的问题。您可以将该验证设置为仅在服务器端工作以使用.Net正则表达式引擎,但这确实需要回发。