PostSharp 参数验证 - 使用 RegularExpressionAttribute 查找 leading/trailing 个空格

PostSharp Parameter Validation - Using RegularExpressionAttribute to find leading/trailing spaces

我正在使用 PostSharp 3.1 来使用验证属性来验证属性的参数。我想使用 RegularExpressionAttribute 来执行验证,它接受一个代表正则表达式的字符串。如果字符串有任何前导或尾随的白色space,我想抛出一个异常,但字符串可能包含单词之间的spaces。

在使用 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"

不幸的是,我的正则表达式似乎匹配错误,我了解到正则表达式中没有 "not" 运算符。此外,我当前的表达式在有效字符串 "North West" 上匹配(并抛出异常),因为它与中间的 space 匹配。

是否可以在不创建自定义属性的情况下巧妙地做到这一点?

RegularExpressionAttribute 中的正则表达式必须匹配整个文本。这是 source code:

的摘录
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);

因此,您需要添加 .* 以捕获介于两者之间的任何内容。

您可以使用

^[^ ].*[^ ]$

正则表达式表示 "match a non-space, then any number of characters other than whitespace, and non-space at the end"。这也意味着必须至少有 2 个字符才能匹配。 Here is a demo 你可以在哪里测试这个正则表达式。尽管它适用于 PCRE,但该模式在 C# 环境中的行为相同(只是出于演示目的我添加了 m 标志)。

为了只执行检查并允许 1 或 0 个字符串,您可以使用环视 ^(?=[^ ]).*(?<=[^ ])$。请参阅 another demo 并注意最后一行,其中 1 现在被视为有效输入。