【问题标题】:Regular expression in RegularExpressionAttribute behaviorRegularExpressionAttribute 行为中的正则表达式
【发布时间】:2018-10-22 15:50:19
【问题描述】:

我正在使用这个正则表达式:@"[ \]\[;\/\\\?:*""<>|+=]|^[.]|[.]$"

第一部分[ \]\[;\/\\\?:*""<>|+=] 应该匹配括号内的任何字符。

如果字符串以“点”开头,则下一部分 ^[.] 应该匹配

如果字符串以“点”结尾,则最后一部分 [.]$ 应该匹配

如果我使用Regex.IsMatch() 函数,这将非常有效。但是,如果我在ASP.NET MVC 中使用RegularExpressionAttribute,我总是会得到无效的模型。有谁知道为什么会发生这种行为?

例子:

“abcdefg”不应该匹配

".abcdefg" 应该匹配

“abc.defg”不应匹配

“abcdefg”。应该匹配

"abc[defg" 应该匹配

提前致谢!

编辑:

正则表达式属性Specifies that a data field value in ASP.NET Dynamic Data must match the specified regular expression.

这意味着。我需要“abcdef”匹配,而“.abcdefg”不匹配。基本上否定我上面的整个表达。

【问题讨论】:

    标签: c# asp.net regex asp.net-mvc


    【解决方案1】:

    您需要确保模式与整个字符串匹配。

    在一般情况下,您可以使用.* 附加/前置模式。

    在这里,你可以使用

    .*[ \][;/\\?:*"<>|+=].*|^[.].*|.*[.]$
    

    或者,为了提高效率(即减少第一个分支中的回溯),否定字符类的性能会更好:

    [^ \][;/\\?:*"<>|+=]*[ \][;\/\\?:*"<>|+=].*|^[.].*|.*[.]$
    

    但最好将匹配文本的分支放在字符串的开头/结尾作为第一个分支:

    ^[.].*|.*[.]$|[^ \][;/\\?:*"<>|+=]*[ \][;/\\?:*"<>|+=].*
    

    注意:您不必在 .NET 正则表达式中转义 /? 字符,因为您不能在其中使用正则表达式分隔符。

    最后一个模式的 C# 声明如下所示

    @"^[.].*|.*[.]$|[^ \][;/\\?:*""<>|+=]*[ \][;/\\?:*""<>|+=].*"
    

    看到这个.NET regex demo

    RegularExpressionAttrubute:

    [RegularExpression(
      @"^[.].*|.*[.]$|[^ \][;/\\?:*""<>|+=]*[ \][;/\\?:*""<>|+=].*", 
      ErrorMessage = "Username cannot contain following characters: ] [ ; / \\ ? : * \" < > | + =")
    ]
    

    【讨论】:

    • 您好,感谢您的回复。这就是我所拥有的:[RegularExpression(@"^[.].*|.*[.]$|[^ \][;/\\?:*""&lt;&gt;|+=]*[ \][;/\\?:*""&lt;&gt;|+=].*", ErrorMessage = "Username cannot contain following characters ] [ ; / \\ ? : * \" &lt; &gt; | + =")] 在 MVC 属性中。对于t1234513123huberttest\\`test username,它失败了。我现在想起来,我认为它可以反过来工作。正则表达式必须匹配字符串才能通过验证。但是,huberttest\\怎么还是不行。
    • 好的。我认为问题在于我有其他方式。请查看更新后的问题。
    • @HubertJarema 你的意思是你需要否定these results吗?喜欢this regex
    【解决方案2】:

    您的正则表达式是一个alternation,它匹配 3 个字符类中的 1 个字符,第一个字符包含超过 1 个字符,第二个是字符串开头的点,第三个是字符串末尾的点.

    它可以正常工作,因为它确实匹配其中一个交替,而不是您要匹配的整个字符串。

    您可以使用 3 次交替,第一次匹配一个点,然后重复字符类直到字符串的末尾,第二个相反,但这次点在字符串的末尾。

    或者第三个使用肯定的前瞻断言字符串至少包含一个字符[\][;\/\\?:*"&lt;&gt;|+=]

    ^\.[a-z \][;\/\\?:*"&lt;&gt;|+=]+$|^[a-z \][;\/\\?:*"&lt;&gt;|+=]+\.$|^(?=.*[\][;\/\\?:*"&lt;&gt;|+=])[a-z \][;\/\\?:*"&lt;&gt;|+=]+$

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      相关资源
      最近更新 更多