我使用PostSharp 3.1来验证使用验证属性的参数。我想使用RegularExpressionAttribute来执行验证,它接受一个表示正则表达式的字符串。如果字符串有任何前导或尾随空格,我想抛出一个异常,但字符串可能包含单词之间的空格。
在使用PostSharp属性之前,我执行了如下检查:
if(name == name.Trim())
{
throw new ArgumentException("name", "Name contains leading/trailing whitespace");
}
相反,我想这样写:
[RegularExpression("[ \s]+|[ \s]+$")]
public name { get; private set; }
哪个匹配(即这些是非法的并抛出异常)
" North West"
"North West "
" North West "
" NorthWest"
"NorthWest "
" NorthWest "
但是不匹配(即这些是合法的)
"North West"
"NorthWest"
不幸的是,似乎我的regex匹配错误的方式,我被告知在regex中没有"非"操作符。此外,我当前的表达式匹配(并抛出异常)有效字符串"North West"
,因为它匹配中间的空间。
在不创建自定义属性的情况下这样做是可能的和整洁的吗?
RegularExpressionAttribute
中的正则表达式必须匹配整个文本。以下是源代码的摘录:
override bool IsValid(object value) {
//...
// We are looking for an exact match, not just a search hit. This matches what
// the RegularExpressionValidator control does
return (m.Success && m.Index == 0 && m.Length == stringValue.Length);
因此,您需要添加.*
来捕获介于两者之间的任何内容。
可以使用
^[^ ].*[^ ]$
regex的意思是"匹配一个非空格,然后匹配除空格以外的任意数量的字符,最后匹配非空格"。这也意味着必须至少有2个字符匹配。下面是一个示例,您可以在其中测试这个正则表达式。虽然它是针对PCRE的,但该模式在c#环境中的行为是相同的(只是为了演示而添加了m
标志)。
为了只执行检查,甚至允许1或0个字符串,您可以使用查找^(?=[^ ]).*(?<=[^ ])$
。请参阅另一个演示,并注意最后一行,其中1
现在被认为是一个有效的输入。