web-dev-qa-db-ja.com

正規表現ワイルドカード

私は_Regular Expressions_を使い始めたばかりですが、これは非常に圧倒されるため、ドキュメントを読んだ後でも、問題の解決にどこから始めればよいかわからないようです。

ひもの束が必要です。

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

そして、ワイルドカードを含む文字列があります。

_"* - Notepad"
_

これらの文字列のいずれかをワイルドカードを含む文字列と比較すると、trueが返される必要があります。 (Regex.IsMatch()またはそのようなものを使用します。)

私は通常そのような答えを求めませんが、必要なものが見つからないだけです。誰かが私を正しい方向に向けることができますか?

12
phadaphunk

ワイルドカード_*_は、正規表現パターン_".*"_(貪欲)または_".*?"_(貪欲ではない)と同等であるため、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)_に一致し、他には一致しません。つまり、可能な限り短い部分文字列です。

17
Nolonar

私はこれをすばやく書きました(に基づいて 文字列に正確な単語が含まれていることを検証します

    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

幸運を!

3
Thomas

あなたが望むパターンは次のようです:

/^.+-\s*Notepad$/

このパターンは、「-Notepad」で終わる場合、文字列全体と一致します。

1
Daedalus