最好的通配符搜索正则表达式?

时间:2014-04-29 13:07:11

标签: c# regex asp.net-mvc

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

你会发现问题是正则表达式本质上比通配符更灵活,因此不像单数*含义那么简单"任何长度的任何字符"。

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

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

复制通配符的最简单方法是使用.+,因为它断言您可以在1和无限次之间找到任何内容。如果您想将其设为可选项,则可以使用.*

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

答案 1 :(得分:0)

这看起来相当复杂,如果我理解正确,那么你想实现一个通配符搜索并在下面使用Regex。

因此,如果用户键入hel * oo

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

所以我会这样做:

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

您只需要根据输入

生成传递给Regex构造函数的搜索模式

答案 2 :(得分:0)

所以,我通过仔细看看我的代码找到了答案。我最终将它分解为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})"

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

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