RegularExpressionAttribute行为中的正则表达式

时间:2018-10-22 15:50:20

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

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

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

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

如果字符串以'。'结尾,则最后部分[.]$应该匹配

如果我使用Regex.IsMatch()函数,则可以很好地工作。但是,如果我在RegularExpressionAttribute中使用ASP.NET MVC,则总是会得到无效的模型。有谁知道为什么会发生这种现象?

示例:

“ abcdefg”不匹配

“。abcdefg”应匹配

“ abc.defg”不匹配

“ abcdefg”。应该匹配

“ abc [defg”应该匹配

谢谢!

编辑:

RegularExpressionAttribute Specifies that a data field value in ASP.NET Dynamic Data must match the specified regular expression.

是什么意思。我需要“ abcdef”匹配,而“ .abcdefg”不匹配。基本上否定了我上面的整个表达式。

2 个答案:

答案 0 :(得分:3)

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

在一般情况下,您可以在模式之前附加.*

在这里,您可以使用

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

或者,为了使其更有效率(即减少第一分支中的回溯),否定的字符类将表现得更好:

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

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

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

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

最后一个模式的C#声明看起来像

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

请参阅此.NET regex demo

RegularExpressionAttrubute

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

答案 1 :(得分:1)

您的正则表达式是alternation,它与3个字符类别中的1个字符匹配,第一个由1个以上的字符组成,第二个为字符串开头的点,第三个为末尾的点。字符串。

之所以能够正常工作,是因为它确实匹配了其中一种替代方式,只匹配了您要匹配的整个字符串。

您可以使用3种交替方式,其中第一个与一个点匹配,然后重复字符类直到字符串的结尾,第二个以相反的方式重复,但是这次点在字符串的结尾。

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

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

Regex demo