PostSharp参数验证-使用regulareexpression attribute来查找前导/尾随空格



我使用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现在被认为是一个有效的输入。

相关内容

  • 没有找到相关文章

最新更新