正则表达式通配符

pha*_*unk 12 c# regex string wildcard

我刚刚开始使用Regular Expressions,这是如此的压倒性,即使阅读文档后,我似乎无法找到从哪里开始帮助解决我的问题.

我需要一堆字符串.

 "Project1 - Notepad"
 "Project2 - Notepad"
 "Project3 - Notepad"
 "Untitled - Notepad"
 "HeyHo - Notepad"
Run Code Online (Sandbox Code Playgroud)

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

"* - Notepad"
Run Code Online (Sandbox Code Playgroud)

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

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

Nol*_*nar 17

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

string pattern = Regex.Escape(inputPattern).Replace("\\*", ".*?");
Run Code Online (Sandbox Code Playgroud)

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

Regex.IsMatch(input, ".NET"); // may match ".NET", "aNET", "FNET", "7NET" and many more
Run Code Online (Sandbox Code Playgroud)

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


使用模式

你可以这样做:

Regex.IsMatch(input, pattern);
Run Code Online (Sandbox Code Playgroud)

要么

var regex = new Regex(pattern);
regex.IsMatch(input);
Run Code Online (Sandbox Code Playgroud)

贪婪和不贪婪之间的区别

不同之处在于模式将尝试匹配多少.

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

贪婪只会匹配"(x+1)(x-1)",没有别的.它基本上匹配它可以匹配的最长子串.

非贪婪会匹配"(x+1)",(x-1)而不是别的.换句话说:最短的子串可能.


Ale*_*eed 5

我刚刚写了这个(基于验证字符串包含一些确切的单词)

    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();
    }
Run Code Online (Sandbox Code Playgroud)