Regex 为什么不是';t RegularExpressionValidator是否匹配我的正则表达式?
使用Regex 为什么不是';t RegularExpressionValidator是否匹配我的正则表达式?,regex,webforms,Regex,Webforms,使用asp:RegularExpressionValidator验证asp:TextBox控件时遇到问题。我已经简化了我正在使用的正则表达式,并隔离了正则表达式验证器在这部分失败的原因:(?=(.[A-Z]){2},我不知道为什么 正则表达式的这一部分要求输入至少包含两个大写字母。我已经使用LINQPad使用“Regex”类测试了表达式: Regex.Match(“THis”,“(?=(.[A-Z]){2}”).Dump() 还有两个在线regex测试人员,他们都可以使用 根据中的备注部分,Re
asp:RegularExpressionValidator
验证asp:TextBox
控件时遇到问题。我已经简化了我正在使用的正则表达式,并隔离了正则表达式验证器
在这部分失败的原因:(?=(.[A-Z]){2}
,我不知道为什么
正则表达式的这一部分要求输入至少包含两个大写字母。我已经使用LINQPad使用“Regex”类测试了表达式:
Regex.Match(“THis”,“(?=(.[A-Z]){2}”).Dump()代码>
还有两个在线regex测试人员,他们都可以使用
根据中的备注部分,RegularExpressionValidator
类在客户端上使用JScript正则表达式语法。我找不到任何对JScript正则表达式语法的引用,所以我假设它们指的是JavaScript,并使用此,这表明它可以与JavaScript一起工作。要使它与RegularExpressionValidator一起工作,我需要在表达式末尾添加一个*
:
(?=(.*[A-Z]){2,}).*
更新
解释添加*
的原因。Viktor说模式可以更好地写成^(?:[^A-Z]*[A-Z]){2}.$
,但我没有遵循这一点,因为我需要向表达式添加额外的部分来实现一些其他规则,例如“必须包含至少两个小写字母”,这需要使用积极的前瞻性;使用非捕获组并不能促进这一点。关键是RegularExpressionAttribute
需要完整的字符串匹配。它没有被记录下来,但它非常雄辩:
override bool IsValid(object value) {
this.SetupRegex();
// Convert the value to a string
string stringValue = Convert.ToString(value, CultureInfo.CurrentCulture);
// Automatically pass if value is null or empty. RequiredAttribute should be used to assert a value is not empty.
if (String.IsNullOrEmpty(stringValue)) {
return true;
}
Match m = this.Regex.Match(stringValue);
// 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);
}
请参见//我们正在寻找精确匹配,而不仅仅是搜索命中率。这与RegularExpressionValidator
控件的功能相匹配
因此,您必须将模式的一部分添加到正则表达式中,因为您的(?=(.*[a-Z]){2}
仅部分匹配,如果字符串中有2个大写ASCII字母,并且m.Length==stringValue.Length
条件不满足,它将匹配字符串开头的空白
实际上,它可以写得更好
^(?:[^A-Z]*[A-Z]){2}.*$
请参阅(似乎^
(字符串开头)和$
(字符串结尾)锚定在代码中是多余的,模式锚定在代码中)
详细信息:
^
-字符串的开头
(?:[^A-Z]*[A-Z]){2}
-2序列:
[^A-Z]*
-除ASCII大写字母外,零个或多个字符
[A-Z]
-大写ASCII字母
*
-除换行符以外的任何零个或多个字符
$
-字符串结尾
谢谢您的回答。我避免了以^(?:[^A-Z]*[A-Z]){2}.*$的形式重新编写,因为我需要在表达式中添加其他部分来实现一些其他规则,例如“必须包含至少两个小写字母”,这需要使用积极的前瞻性;使用非捕获组不会促进这一点。当然,lookahead是更简单的解决方案。只有完整的字符串必须与模式匹配。祝你好运。使用非捕获组并不能促进这一点,但可以确保你的lookaheads的效率。一个包含至少2个字母和至少2个数字的正则表达式可以写成和,并且差异是明显的(44步与23步)。