在ASP.NET RegularExpressionValidator中使正则表达式不区分大小写

44

给定这个正则表达式:"^[0-9]*\s*(lbs|kg|kgs)$",如何使它忽略大小写?我正在尝试在 .net 正则表达式验证器中使用它,所以需要在模式中指定大小写不敏感。

由于我正在 RegularExpressionValidator 中指定正则表达式,所以无法在程序中使用 RegexOptions。


不使用 RegexOptions 枚举实现大小写不敏感的正则表达式。 - CAD bloke
对于ASP.NET MVC,请查看此类似的问题,适用于[RegularExpressionAttribute] - KyleMit
4个回答

58

我发现了。

区分大小写:^[0-9]\s(lbs|kg|kgs)$

不区分大小写:(?i:^[0-9]\s(lbs|kg|kgs)$)

我相信这个正则表达式是针对 .NET 实现的。因此,如果您在 RegularExpressionValidator 中使用它,则必须关闭客户端验证,因为 JavaScript 正则表达式解析器将无法识别 ?i 标记。


7
实际上,大多数内置语言都支持像(?i)这样的行内修饰符:Perl、Python、PHP、Ruby、Java、.NET......JavaScript 是最后一个抵制它的语言,这确实很麻烦!顺便说一句,@Geoff 在评论中提到了 (?i) - Alan Moore
7
如果你在表达式前面加上(?i),就会更容易,像这样:(?i)^[0-9]\s(lbs|kg|kgs)$。 - JCM

5

如果需要在服务器端和客户端实现不区分大小写的验证,且使用大写/小写[A-Za-z]字符方法过于繁琐,则可以考虑使用CustomValidator进行替代。

此方法结合了其他答案,使用了服务器端RegEx对象和客户端JavaScript语法。

CustomValidator:

<asp:CustomValidator ID="cvWeight" runat="server" ControlToValidate="txtWeight"
  OnServerValidate="cvWeight_Validate" ClientValidationFunction="cvWeight_Validate"
  ValidateEmptyText="true" Text="*" ErrorMessage="Invalid entry." />

代码后台:

protected void cvWeight_Validate(object sender, ServerValidateEventArgs args)
{
    Regex re = new Regex(@"^[0-9]*\s*(lbs|kg|kgs)$", RegexOptions.IgnoreCase);
    args.IsValid = re.IsMatch(args.Value);
}

客户端验证函数:
function cvWeight_Validate(sender, args) {
  var reWeight = /^[0-9]*\s*(lbs|kg|kgs)$/i;
  args.IsValid = reWeight.test(args);
}

这对我来说运行良好,除了在使用ValidationSummary时。在客户端验证时,错误*会显示,但我无法在摘要中显示错误消息。只有提交时才会显示摘要。我认为它应该显示; 我有一些更新面板和旧代码的混合,这可能是问题所在。


4
最简单的方法就是修改正则表达式为:
^[0-9]*\s*([lL][bB][sS]|[kK][gG][sS]?)$

虽然阅读起来有些困难,但这个技术方案会很好地发挥作用。


3
注意:仅在实在非常小的正则表达式时才这样做。 - vbullinger
1
这个解决方案降低了可维护性。 - Stephan

4

我们可以使 C#中的正则表达式不区分大小写? : 可以

通过 (?i) 模式构造RegexOptions.IgnoreCase 参数来设置内联选项

我们可以使 JavaScript中的正则表达式不区分大小写? : 可以

通过 /pattern/flags 语法或不区分大小写的标志 /REGEX/i 来设置标志

(旁白) 我们能否使 HTML5 Pattern属性中的正则表达式不区分大小写不能

正如Chris R. Timmons在 RegularExpressionValidator不忽略大小写 中指出的那样:

RegularExpressionValidator控件中没有允许设置正则表达式选项的属性。

如果您的控件同时进行客户端和服务器端验证,正则表达式必须使用JS和.NET都可以执行的正则表达式语法子集。在这种情况下,要使正则表达式忽略大小写,必须使用字符类构造,如[a-zA-Z] 来匹配大写和小写字符。

如果您的验证仅在服务器端完成,则可以使用更强大的.NET正则表达式语法。在这种情况下,您可以在正则表达式开头放置(?i)选项,告诉它忽略大小写。

因此,如果您想使用开箱即用的验证器,则必须使用类似于以下内容的字符集,这是Geoff提出的解决方案:[aA]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接