我刚刚开始使用Regular Expressions
,这非常令人难以置信,即使在阅读文档之后,我似乎无法找到从哪里开始帮助解决我的问题。
我需要一堆字符串。
"Project1 - Notepad"
"Project2 - Notepad"
"Project3 - Notepad"
"Untitled - Notepad"
"HeyHo - Notepad"
我有一个包含外卡的字符串。
"* - Notepad"
如果我将这些字符串中的任何一个与包含通配符的字符串进行比较,我将需要它返回true。 (使用Regex.IsMatch()
或类似的东西..)
我通常不会要求这样的答案,但我找不到我需要的东西。有人可以指出我正确的方向吗?
答案 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$/
如果整个字符串以“ - 记事本”结尾,则此模式将匹配整个字符串。