【问题标题】:Best wildcard search regex? [duplicate]最佳通配符搜索正则表达式? [复制]
【发布时间】:2014-04-29 13:07:11
【问题描述】:

我正在尝试创建一个正则表达式,允许人们使用“*”作为通配符进行搜索,据我了解,这是非常标准的。对于当前的正则表达式,我有以下内容:

@"($([a-zA-Z0-9!\@#\$%\^&\(\)-_\+\.'`~/=\?\{\}\|]){6,255}|([\w]){0,0})"

当我运行代码并尝试使用通配符进行搜索时,它告诉我“至少需要一个字符”,这让我相信它只是读取通配符部分而不是第一个具有里面的所有人物。我在这个正则表达式中做错了什么?

顺便说一下,这是针对 C# 中的 ASP.NET MVC 3 项目。

Edit::: 此正则表达式是 MVC 3 项目中 ViewModel 的一部分,该正则表达式是视图模型中属性的数据注释的一部分。我不打算将代码放在其他任何地方,而是放在数据注释中,这就是为什么它是一行代码。这是上面代码的完整注释:

[RegularExpression(@"($([a-zA-Z0-9!\@#\$%\^&\(\)-_\+\.'`~/=\?\{\}\|]){6,255}|([\w]){0,0})", ErrorMessageResourceType = typeof(AdminResource), ErrorMessageResourceName = "SearchWildcardError")]

【问题讨论】:

  • 对于匹配字符串terminator,你需要像^ter.*tor这样的正则表达式,假设用户输入了ter*tor

标签: c# regex asp.net-mvc


【解决方案1】:

您会发现的问题是,正则表达式本质上比通配符灵活得多,因此不像单数 * 那样简单,意思是“任何长度的任何字符”。

在正则表达式中,最接近通配符的是.,但如果你不量化长度,它将始终只匹配一个的实例任何字符。

显然有很多方法可以量化正则表达式.....{3}.*.+ 甚至.++

复制通配符的最简单方法是使用.+,因为它断言您可以找到 1 次到无限次之间的任何内容。如果你想让它成为可选的,那么你可以使用.*

如果你想要传统类型的通配符,那么正则表达式不是它的工具。

【讨论】:

    【解决方案2】:

    这似乎很复杂,如果我理解正确,那么您想实现通配符搜索并在下面使用正则表达式。

    所以如果用户输入 el*oo

    像 helcopteroo 这样的东西会匹配或只是 heloo

    所以我会这样做:

    Regex reg = new Regex(@"hel[a-zA-Z0-9]*oo", RegexOptions.IgnoreCase);
    var matches = reg.Matches("helloo hel022oo helcoopter");
    

    您只需要根据您的输入生成传递给 Regex 构造函数的搜索模式

    【讨论】:

      【解决方案3】:

      所以,我通过仔细查看我的代码找到了答案。我最终将它分解为 2 个不同的正则表达式。一个用户名:

      @"($(\w@\.){6,255}|([a-zA-Z0-9!\@#\$%\^&\(\)-_\+\.'`~\/=\?\{\}\|]){2,50}|([\w]){0,0})"
      

      这仍然允许正常搜索和使用带有我需要的所有特殊字符的通配符。这个错误没有正确转义“/”。这个现在工作正常。用于电子邮件的第二个正则表达式:

      @"($(\w@\.){1,50}|([a-zA-Z0-9@\*\._]){2,50}|([\w]){0,0})"
      

      只允许一些特殊字符,仍然允许通过通配符进行搜索,但必须包含“@”符号以使其成为有效搜索。

      附:我找到了一个漂亮的链接,可以让你测试有效的正则表达式,如果有人需要,你可以在这里找到它:http://regex101.com/#pcre 这个小工具很好用!

      【讨论】:

        猜你喜欢
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-14
        • 2013-02-22
        • 2010-12-15
        • 1970-01-01
        相关资源
        最近更新 更多