Regex RegularExpressionAttribute-如何使客户端验证不区分大小写?

Regex RegularExpressionAttribute-如何使客户端验证不区分大小写?,regex,asp.net-mvc-2,client-side-validation,Regex,Asp.net Mvc 2,Client Side Validation,我有一个用于客户端验证的字符串: private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"; 我在我的[RegularExpression(regex,ErrorMessage=“invalid”)]属性中使用此字符串 我知道Javascript正则表达式的/I标志用于使其不区分大小写,但只是将其固定在正则表达式的末尾(即,@“^

我有一个用于客户端验证的字符串:

private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
我在我的
[RegularExpression(regex,ErrorMessage=“invalid”)]
属性中使用此字符串

我知道Javascript正则表达式的
/I
标志用于使其不区分大小写,但只是将其固定在正则表达式的末尾(即,
@“^….$/I”
不起作用-正则表达式验证完全失败,无论输入的内容(有效或无效)

我遗漏了什么?

在C中,您可以内联一些正则表达式选项。要指定忽略大小写的选项,您需要添加
(?I)
到您模式的开头。但是,我不确定
RegularExpressionAttribute如何处理这一问题,以及它是否处理客户端的翻译。根据我使用ASP.NET的
RegularExpressionValidator的经验,我怀疑这一点;regex应该足够普通,可以用于两个引擎

private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([a-zA-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
在任何情况下,如果它是有效的,它将如下所示:

@"^(?i)(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"

我创建了这个属性,它允许您指定RegexOptions.EDIT:它还集成了不引人注目的验证。客户端将只遵守RegexOptions.Multiline和RegexOptions.IgnoreCase,因为这是JavaScript支持的

[RegularExpressionWithOptions(@".+@example\.com", RegexOptions = RegexOptions.IgnoreCase)]
C#


Anthony Stevens的这篇文章帮助我实现了这一点:

ah!当然!回答很好-但是,我必须问:有没有一种方法可以使用不区分大小写的标志?正则表达式re=new Regex(@“^(?:::::::::::::\d{5}(?::\s*-\s*\d{5});([a-zA-Z]{2})\d{3}(?::\s*-\s*\1\d{3});(?::,\s*)$”,RegexOptions.IgnoreCase);//这是c#代码。问题与RegularExpressionAttribute有关,在这里您只能传递字符串。因此您不能使用带有属性的Regex类。我还没有测试您的解决方案,但我知道通用方法可以工作,因为它解决了类似的问题:非常棒的解决方案!我尝试清理并利用现成的Regex validato通过将输出模式包装在中,但值被传递到构造函数语法中,而构造函数语法不会解析属性,因此编写客户端标志的方法也是正确的,同时处理我们自己的问题是.NET和JS使用不同风格的正则表达式,因此如果我们希望相同的模式在客户端和在e服务器上,我们必须使用在JS和C#中安全的正则表达式语法的子集。或者,类似的方法允许我们通过在服务器和客户端上分支验证逻辑来丰富地编写和控制这两种语言中的修饰符
public class RegularExpressionWithOptionsAttribute : RegularExpressionAttribute, IClientValidatable
{
    public RegularExpressionWithOptionsAttribute(string pattern) : base(pattern) { }

    public RegexOptions RegexOptions { get; set; }

    public override bool IsValid(object value)
    {
        if (string.IsNullOrEmpty(value as string))
            return true;

        return Regex.IsMatch(value as string, "^" + Pattern + "$", RegexOptions);
    }

    public IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "regexwithoptions"
        };

        rule.ValidationParameters["pattern"] = Pattern;

        string flags = "";
        if ((RegexOptions & RegexOptions.Multiline) == RegexOptions.Multiline)
            flags += "m";
        if ((RegexOptions & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase)
            flags += "i";
        rule.ValidationParameters["flags"] = flags;

        yield return rule;
    }
}
(function ($) {

    $.validator.unobtrusive.adapters.add("regexwithoptions", ["pattern", "flags"], function (options) {
        options.messages['regexwithoptions'] = options.message;
        options.rules['regexwithoptions'] = options.params;
    });

    $.validator.addMethod("regexwithoptions", function (value, element, params) {
        var match;
        if (this.optional(element)) {
            return true;
        }

        var reg = new RegExp(params.pattern, params.flags);
        match = reg.exec(value);
        return (match && (match.index === 0) && (match[0].length === value.length));
    });

})(jQuery);