16

我刚开始使用Regular Expressions,这太让人不知所措了,即使在阅读了文档之后,我似乎也无法找到从哪里开始帮助解决我的问题。

我要一串串。

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

我有一个包含通配符的字符串。

"* - Notepad"

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

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

4

4 回答 4

26

通配符*等效于正则表达式模式".*"(greedy) 或".*?"(not-greedy),因此您需要执行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)"没有别的。换句话说:可能的最短子串。

于 2013-03-07T15:59:25.227 回答
5

我只是快速写了这个(基于Validate that a string contains 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();
    }
于 2013-03-07T16:05:04.157 回答
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

祝你好运!

于 2013-03-07T16:10:28.837 回答
1

似乎您想要的模式如下:

/^.+-\s*Notepad$/

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

于 2013-03-07T16:04:27.973 回答