用通配符正则表达式?

时间:2014-04-18 19:24:46

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

如果没有阅读用户的想法,那么他们真的无法确切地知道*字面意思还是通配符。我建议双向运行搜索并使用更高优先级的字面解释对结果进行排序。

这里大概是一个实现可能是什么样的,用一些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();
}