我在MVC应用程序中使用正则表达式,允许用户创建包含许多特殊字符的用户名,包括*
。一个小问题,当搜索用户时,我们允许使用*
的通配符搜索作为搜索的通配符部分。这就是正则表达式在创建方面的样子:
@"^([a-zA-Z0-9!\@#\$%\^&\*\(\)-_\+\.'`~/=\?\{\}\|]){6,255}$"
以下是正则表达式在搜索方面的样子:
@"^([a-zA-Z0-9!\@#\$%\^&\*\(\)-_\+\.'`~/=\?\{\}\|]){6,255}$|([\w]){0,0})"
通过允许用户搜索用户名中可能包含*
的整个用户名,同时仍允许其他用户使用*
作为通配符,是否有办法使此工作正常搜索?
答案 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();
}