私は_Regular Expressions
_を使い始めたばかりですが、これは非常に圧倒されるため、ドキュメントを読んだ後でも、問題の解決にどこから始めればよいかわからないようです。
ひもの束が必要です。
_ "Project1 - Notepad"
"Project2 - Notepad"
"Project3 - Notepad"
"Untitled - Notepad"
"HeyHo - Notepad"
_
そして、ワイルドカードを含む文字列があります。
_"* - Notepad"
_
これらの文字列のいずれかをワイルドカードを含む文字列と比較すると、trueが返される必要があります。 (Regex.IsMatch()
またはそのようなものを使用します。)
私は通常そのような答えを求めませんが、必要なものが見つからないだけです。誰かが私を正しい方向に向けることができますか?
ワイルドカード_*
_は、正規表現パターン_".*"
_(貪欲)または_".*?"
_(貪欲ではない)と同等であるため、string.Replace()
を実行する必要があります。
_string pattern = Regex.Escape(inputPattern).Replace("\\*", ".*?");
_
最初のRegex.Escape(inputPattern)
に注意してください。 inputPattern
には、正規表現で使用される特殊文字が含まれている可能性があるため、それらの文字を適切にエスケープする必要があります。そうしないと、パターンが爆発します。
_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)"
のみに一致し、他には一致しません。基本的に、一致できる最長の部分文字列に一致します。
Not-greedyは"(x+1)"
および_(x-1)
_に一致し、他には一致しません。つまり、可能な限り短い部分文字列です。
私はこれをすばやく書きました(に基づいて 文字列に正確な単語が含まれていることを検証します )
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();
}
あなたはこのようにするべきです:
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
幸運を!
あなたが望むパターンは次のようです:
/^.+-\s*Notepad$/
このパターンは、「-Notepad」で終わる場合、文字列全体と一致します。