16

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

たくさんの文字列が必要です。

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

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

"* - Notepad"

これらの文字列のいずれかをワイルドカードを含む文字列と比較すると、true が返される必要があります。(Regex.IsMatch()とかそんな感じで..)

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

4

4 に答える 4

26

ワイルドカードは Regex パターン(greedy) または(not-greedy)*と同等であるため、以下を実行する必要があります。".*"".*?"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". (開き括弧と閉じ括弧、およびその間のものを一致させる必要があり)ます。

Greedy は一致するだけ"(x+1)(x-1)"で、他には何も一致しません。基本的に、検索できる最長の部分文字列に一致します。

Not-Greedy は一致"(x+1)"し、他には"(x-1)"何もありません。言い換えれば、可能な限り短い部分文字列です。

于 2013-03-07T15:59:25.227 に答える
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();
    }
于 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$/

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

于 2013-03-07T16:04:27.973 に答える