如何在正则表达式中忽略大小写?

发布于 2024-11-06 14:53:21 字数 447 浏览 0 评论 0原文

我有一个 ASP.NET MVC 应用程序。有一个名为 File 的实体,它有一个名为 Name 的属性。

using System.ComponentModel.DataAnnotations;

public class File    {
   ...
   [RegularExpression(@"([^.]+[.](jpg|jpeg|gif|png|wpf|doc|docx|xls|xlsx ..., ErrorMessage = "Invali File Name"]
   public string Name{ get; set; }
   ...
}

有一个正则表达式验证器可以检查文件扩展名。 有没有一种快速方法可以告诉它忽略扩展名的大小写,而不必显式地将大写变体添加到我的验证表达式中? 我需要这个正则表达式验证器用于服务器端和客户端。 “(?i)”可以用于服务器端,但这不适用于客户端

I have an asp.net MVC application. There is an entity called File that it has a property called Name.

using System.ComponentModel.DataAnnotations;

public class File    {
   ...
   [RegularExpression(@"([^.]+[.](jpg|jpeg|gif|png|wpf|doc|docx|xls|xlsx ..., ErrorMessage = "Invali File Name"]
   public string Name{ get; set; }
   ...
}

There is a RegularExpressionValidator that checks file extensions.
Is there a quick way I can tell it to ignore the case of the extension without having to explicitly add the upper case variants to my validation expression?
I need this RegularExpressionValidator for both Server-side and client-side.
"(?i)" can be used for Server-side, but this doesn't work client-side

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别靠近我心 2024-11-13 14:53:21

我能想到的一种方法是编写一个自定义验证属性:

public class IgnorecaseRegularExpressionAttribute : RegularExpressionAttribute, IClientValidatable
{
    public IgnorecaseRegularExpressionAttribute(string pattern): base("(?i)" + pattern)
    { }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "icregex",
            ErrorMessage = ErrorMessage
        };
        // Remove the (?i) that we added in the pattern as this
        // is not necessary for the client validation
        rule.ValidationParameters.Add("pattern", Pattern.Substring(4));
        yield return rule;
    }
}

然后用它装饰你的模型:

[IgnorecaseRegularExpression(@"([^.]+[.](jpg|jpeg|gif|png|wpf|doc|docx|xls|xlsx", ErrorMessage = "Invalid File Name"]
public string Name { get; set; }

最后在客户端上编写一个适配器:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
    jQuery.validator.unobtrusive.adapters.add('icregex', [ 'pattern' ], function (options) {
        options.rules['icregex'] = options.params;
        options.messages['icregex'] = options.message;
    });

    jQuery.validator.addMethod('icregex', function (value, element, params) {
        var match;
        if (this.optional(element)) {
            return true;
        }

        match = new RegExp(params.pattern, 'i').exec(value);
        return (match && (match.index === 0) && (match[0].length === value.length));
    }, '');
</script>

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Name)
    @Html.ValidationMessageFor(x => x.Name)
    <input type="submit" value="OK" />
}

当然,你可以将客户端规则外部化到一个单独的javascript文件中,这样你就不必到处重复。

One way I can think of is writing a custom validation attribute:

public class IgnorecaseRegularExpressionAttribute : RegularExpressionAttribute, IClientValidatable
{
    public IgnorecaseRegularExpressionAttribute(string pattern): base("(?i)" + pattern)
    { }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "icregex",
            ErrorMessage = ErrorMessage
        };
        // Remove the (?i) that we added in the pattern as this
        // is not necessary for the client validation
        rule.ValidationParameters.Add("pattern", Pattern.Substring(4));
        yield return rule;
    }
}

and then decorate your model with it:

[IgnorecaseRegularExpression(@"([^.]+[.](jpg|jpeg|gif|png|wpf|doc|docx|xls|xlsx", ErrorMessage = "Invalid File Name"]
public string Name { get; set; }

Finally write an adapter on the client:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
    jQuery.validator.unobtrusive.adapters.add('icregex', [ 'pattern' ], function (options) {
        options.rules['icregex'] = options.params;
        options.messages['icregex'] = options.message;
    });

    jQuery.validator.addMethod('icregex', function (value, element, params) {
        var match;
        if (this.optional(element)) {
            return true;
        }

        match = new RegExp(params.pattern, 'i').exec(value);
        return (match && (match.index === 0) && (match[0].length === value.length));
    }, '');
</script>

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Name)
    @Html.ValidationMessageFor(x => x.Name)
    <input type="submit" value="OK" />
}

Of course you could externalize the client rules into a separate javascript file so that you don't have to repeat it everywhere.

千笙结 2024-11-13 14:53:21

嗯,你能出示客户端验证吗?

嗯,我认为您可以创建自己的从正则表达式派生的属性,并添加忽略大小写的功能。

Umh could you show the Client Validation?

umh I think that you can create your own Attribute that derives from RegularExpression and add the functionallity to ignore case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文