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
现在被视为有效输入。
我正在使用 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
现在被视为有效输入。