Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么不是';t RegularExpressionValidator是否匹配我的正则表达式?_Regex_Webforms - Fatal编程技术网

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步)。