我正在使用 PostSharp 3.1 通过验证属性来验证属性的参数。我想用正则表达式属性执行验证,它接受表示正则表达式的字符串。如果字符串有任何前导或尾随空格,但字符串可能在单词之间包含空格,我想抛出异常。
在使用 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"
因为它与中间的空间相匹配。
是否可以在不创建自定义属性的情况下轻松完成此操作?
里面的正则表达式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);
所以,你需要添加.*
捕捉介于两者之间的任何东西。
您可以使用
^[^ ].*[^ ]$
正则表达式的意思是“匹配非空格,然后是除空格之外的任意数量的字符,最后是非空格”。这也意味着必须至少有 2 个字符才能匹配。这是一个演示您可以在其中测试此正则表达式。虽然它是用于 PCRE,但该模式在 C# 环境中的行为相同(只是我添加了m
用于演示目的的标志)。
为了只执行检查并允许 1 或 0 个字符串,您可以使用环视^(?=[^ ]).*(?<=[^ ])$
. See 另一个演示并注意最后一行1
现在被视为有效输入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)