1

私は正規表現を勉強していますが、まだ学ぶのが難しいと感じています。
だから私の問題はこれです、私は一連のキーワードを与えました:

速い茶色のキツネ

次のような文の束で見つけなければならない場所:

茶色のセクシーキツネは裏庭でとても素早くジャンプします...

これらの単語と一致する場合 (大文字と小文字を区別しない):

ザ、ザ、ブラウン、ブラウン、フォックス、フォックス、クイック、クイック

次に、戻り値はtrue

正規表現でそれを行う方法は?単語を分割して配列に入れてループを使用し、それらを使用して見つけることを考えていまし.Contains(...)たが、それは理想的ではないことはわかっています。

実はもう一つ気になることがあります。しかし、私はそれを新しい質問として投稿することを恐れています。
私の2番目の質問は、正規表現はどのようにパターンを読み取るのですか? 優先順位と最低優先順位は何ですか?
とにかく私の問題を助けてください。

編集

返信が遅くなって申し訳ありませんが、@PatrikWの解決策はうまくいかないようです。
私は静的クラスを持っています:

    public static bool ValidateRegex(string value, string regex)
    {
        value += ""; // Fail safe for null
        Regex obj = new Regex(regex, RegexOptions.IgnoreCase);
        if (value.Trim() == "")
            return false;
        else
        {
            return obj.IsMatch(value);
        }
    }  

正規表現パターンを構築します。

keyword = "maria";
            string regexPattern = "(?<=\b)(";
            string Or = string.Empty;

            foreach (string item in keyword.Split(new char[] { ' ', ',', '.' }, StringSplitOptions.RemoveEmptyEntries).ToList())
            {
                regexPattern += Or + "(" + item + ")";
                Or = "|";
            }

            regexPattern += ")(?=\b)";  

データ情報:

List<Friend> useritems = null;
useritems = ((List<Friend>)SessonHandler.Data.FriendList).Where(i =>
    Utility.ValidateRegex(i.LastName, regexPattern) ||
    Utility.ValidateRegex(i.FirstName, regexPattern) ||
    Utility.ValidateRegex(i.MiddleName, regexPattern)).ToList();

//regexPattern = "(?<=\b)((maria))(?=\b)"
//LastName = "MARIA CALIBRI"
//FirstName = "ALICE"
//MiddleName = null  

コードで何か間違ったことをしたのかもしれません。助けてください。

編集2記号
を忘れました。@これは今すぐ動作するはずです:

string regexPattern = @"(?<=\b)(";
.
.
.
regexPattern += @")(?=\b)";  

下の答えは正しいです。

4

1 に答える 1

4

Felice が示したのは、より動的な解決策ですが、ここでは、取得した正確なキーワードを見つけるためのパターンを示します。

"(?<=\b)((The)|(quick)|(brown)|(fox))(?=\b)"

先頭と末尾のキャプチャ グループがあるため、単語の一部ではなく単語全体にのみ一致します。

次に例を示します。

Regex foxey = new Regex(@"(?<=\b)((The)|(quick)|(brown)|(fox))(?=\b)");
foxey.Options = RegexOptions.IgnoreCase;
bool doesMatch = foxey.IsMatching("the Brown SexyFox Jumps soQuickly in the backyard...");

編集 - 正規表現エンジン:

簡単に言えば、正規表現エンジンは入力文字列を一度に 1 文字ずつ調べ、左端の文字から始めて、記述した正規表現パターンの最初の部分と照合します。一致する場合、パーサーは次の文字に移動し、パターンの次の部分と照合します。パターン全体をうまく通過できれば、それは一致です。

「正規表現エンジン」またはそれらの線に沿った何かを検索するだけで、正規表現の内部がどのように機能するかを読むことができます。ここにピックがあります: http://www.regular-expressions.info/engine.html

于 2012-10-03T12:45:48.157 に答える