正则表达式通配符

时间:2013-03-07 15:55:19

标签: c# regex string wildcard

我刚刚开始使用Regular Expressions,这非常令人难以置信,即使在阅读文档之后,我似乎无法找到从哪里开始帮助解决我的问题。

我需要一堆字符串。

 "Project1 - Notepad"
 "Project2 - Notepad"
 "Project3 - Notepad"
 "Untitled - Notepad"
 "HeyHo - Notepad"

我有一个包含外卡的字符串。

"* - Notepad"

如果我将这些字符串中的任何一个与包含通配符的字符串进行比较,我将需要它返回true。 (使用Regex.IsMatch()或类似的东西..)

我通常不会要求这样的答案,但我找不到我需要的东西。有人可以指出我正确的方向吗?

4 个答案:

答案 0 :(得分:16)

通配符*等同于正则表达式模式".*"(贪婪)或".*?"(非贪婪),因此您需要执行string.Replace()

string pattern = Regex.Escape(inputPattern).Replace("\\*", ".*?");

注意开头的Regex.Escape(inputPattern)。由于inputPattern可能包含Regex使用的特殊字符,因此您需要正确地转义这些字符。如果不这样做,你的模式就会爆炸。

Regex.IsMatch(input, ".NET"); // may match ".NET", "aNET", "FNET", "7NET" and many more

结果,通配符*被转义为\\*,这就是我们替换转义的通配符而不仅仅是通配符本身的原因。


使用模式

你可以这样做:

Regex.IsMatch(input, pattern);

var regex = new Regex(pattern);
regex.IsMatch(input);

贪心和非贪婪之间的区别

区别在于模式将尝试匹配多少。

考虑以下字符串:"hello (x+1)(x-1) world"。您希望匹配左括号(和右括号)以及中间的任何内容。

贪婪只会与"(x+1)(x-1)"匹配,而不会匹配。它基本上匹配它可以匹配的最长子字符串。

非贪婪会匹配"(x+1)"(x-1),而不是其他任何内容。换句话说:最短的子串可能。

答案 1 :(得分:5)

我刚刚写了这个(基于Validate that a string contain some exact words

    static void Main()
    {
        string[] inputs = 
        {
            "Project1 - Notepad", // True
            "Project2 - Notepad", // True
            "HeyHo - Notepad", // True
            "Nope - Won't work" // False
        };

        const string filterParam = "Notepad";
        var pattern = string.Format(@"^(?=.*\b - {0}\b).+$", filterParam);

        foreach (var input in inputs)
        {
            Console.WriteLine(Regex.IsMatch(input, pattern));
        }
        Console.ReadLine();
    }

答案 2 :(得分:3)

你应该这样做:

string myPattern = "* - Notepad";
foreach(string currentString in myListOfString)
    if(Regex.IsMatch(currentString, myPattern, RegexOptions.Singleline){
        Console.WriteLine("Found : "+currentString);
    }
}

顺便说一句,我看到你来自蒙特利尔,附加法语文档+有用的工具: http://www.olivettom.com/?p=84

祝你好运!

答案 3 :(得分:1)

似乎您想要的模式如下:

/^.+-\s*Notepad$/

如果整个字符串以“ - 记事本”结尾,则此模式将匹配整个字符串。