我正在使用以下正则表达式:@"[ \]\[;\/\\\?:*""<>|+=]|^[.]|[.]$"
第一部分[ \]\[;\/\\\?:*""<>|+=]
应该与括号内的任何字符匹配。
如果字符串以“点”开头,则下一部分^[.]
应该匹配
如果字符串以'。'结尾,则最后部分[.]$
应该匹配
如果我使用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”不匹配。基本上否定了我上面的整个表达式。
答案 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 \][;\/\\?:*"<>|+=]+$