【问题标题】:Regular expression with wildcard?带通配符的正则表达式?
【发布时间】:2014-06-03 08:38:22
【问题描述】:

我在 MVC 应用程序中使用正则表达式,它允许用户创建包含许多特殊字符的用户名,包括 *。一个小问题是,在搜索用户时,我们允许通配符搜索使用* 作为搜索的通配符部分。这是正则表达式在创建端的样子:

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

下面是正则表达式在搜索端的样子:

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

有没有办法通过允许用户搜索可能在用户名中包含 * 的整个用户名,同时仍然允许其他用户使用 * 作为通配符搜索来使这项工作正常工作?

【问题讨论】:

  • 请解释一下?
  • this question(我其实不知道C#没有内置的方法来使用glob类型匹配......我真的很惊讶。)
  • 仅供参考,[a-zA-Z0-9!\@#\$%\^&\*\(\)-_\+\.'`~/=\?\{\}\|][a-zA-Z0-9!@#$%^&*()_+.'`~=?{}|-]。这里字符类中唯一特殊的字符是-,也是唯一一个你没有转义的字符......把它放在最后会转义它。

标签: c# regex asp.net-mvc wildcard


【解决方案1】:

如果没有读懂用户的想法,真的无法知道他们的意思是字面意义上的* 还是通配符。我建议以两种方式运行搜索,并以更高优先级的字面解释对结果进行排序。

这大概是一个实现的样子,搜索细节在一些DoSearch 方法中被抽象出来:

IList<Result> GetResults(string input)
{
    var expr = Regex.Escape(input);

    // search once with * as a literal:
    var results1 = DoSearch(expr);

    // replace the * literal with regex snippet:
    expr = expr.Replace("\\*", "(.*)");

    // search again with * as a wildcard
    var results2 = DoSearch(expr);

    // literal gets precidence
    return results1.Concat(results2).ToList();
}

【讨论】:

  • 这里的实现非常有趣。我喜欢它。
猜你喜欢
  • 2018-07-26
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多