2009-03-30 27 views
13

複数の文字列に一致する正規表現を作成する必要があります。たとえば、「良い」または「良い」のすべてのインスタンスを検索したいとします。私はいくつかの例を見つけましたが、思いついたことはうまくいかないようです。複数の文字列に一致する正規表現

\b(good|great)\w*\b 

誰かが正しい方向に向いていますか?

編集:私は完全な単語を一致させたくありません。たとえば、「ood」または「reat」(単語の一部)とも一致させることができます。

編集2:ここにいくつかのサンプルテキストがあります。「これは本当に素晴らしい話です」 "this"または "really"と一致させたい場合や、 "eall"または "reat"と一致させたい場合があります。

あなたの編集後
+1

"oo"、 "o"、 "t"とも一致しますか? – jpalecek

+3

どのような場合はoooooooooooooooooooooooooooooooooooooooooooooooooooo? –

+0

私は、パターンがうまくいっていることを確認しました。これは大丈夫ですか?なぜいくつかの人々の例は、それらのマークアップを持っていますか? –

答えて

21

あなたが予約済み正規表現あなたの単語リストの文字(またはあなたがそれらをエスケープする場合)がないことを保証することができる場合、あなただけのa big word listを作るために、このコードを使用することができます@"(a|big|word|list)"に。 オペレータには、それを囲む限り、使用している間違いがありません。()\w*のように聞こえ、\bのパターンはあなたの試合を妨害しているものです。単に

"g?reat" 

この:あなたは「偉大な」と一致するかのようなパターンでこれを表現することができます「reat」したい場合は

:私は問題を正しく理解していない

String[] pattern_list = whatever; 
String regex = String.Format("({0})", String.Join("|", pattern_list)); 
+1

考えられる1つの間違い:String.Join(word_list、 "|")ではなくString.Join( "|"、word_list)でなければなりません。http://msdn.microsoft.com/en-us/library/57a79xd0 .aspx – David

+0

良いキャッチ - ありがとう!私は私の答えを更新しました。 – ojrac

+1

質問とは逆に、例えば "good"の '' ood ''とは一致しません。 – MikeM

4
(good)*(great)* 

\b(g*o*o*d*)*(g*r*e*a*t*)*\b 
+0

これはなにもありませんooooooooooooooooooooooooooooooooooooooooddddddddddddddddddddddddddddd? –

+0

はい、「ゴア」、「ゴーゴー」、他の意図しない組み合わせがあります。 – Randy

0

「リア」パートが存在しなければならず、「g」はオプションであると述べている。

"reat"と "great"は一致しますが、 "reat"の最初の "r"が必要なため "eat"には一致しません。

あなたはあまりにも言葉「素晴らしい」と「良い」を持っていて、オプションの「G」でそれらの両方に一致する場合は、次のようにこれを書くことができます。

(g?reat|g?ood) 

そして、あなたが含めたい場合以下のような単語境界:

\b(g?reat|g?ood) 

は、あなたが「reat」ではなく「R」を持っているので、これは「breat」のようなものと一致しないことを認識する必要があるため、「Bはワード境界ではなく、 "

"\b\w*?(reat|ood)\w+\b" 

これは、読み取ります: 1.ワード境界で始まるに一致するを開始するので、あなたは、あなたが試してみてくださいサブリンク「reat」または「OOD」を含む単語全体を一致させたい場合は

数字の文字は数えられますが、greadyはありません。 2.「reat」または「ood」をマッチさせると、それらの単語のうちの1つが含まれている単語だけが一致することが確認されます。 3. "reat"または "ood"に続く任意の数の単語文字を、次の単語境界に達するまで一致させます。

これは一致します:

「良」、「良い」、「OOD」(もし完全な単語)

それは次のように読むことができます:「OOD」を含むすべての完全な言葉私を与えますか"reat"。

これはあなたが探しているものですか?

1

私はregexだけであなたがやろうとしていることに対する解決策を提供しているとは確信していません。ただし、次のコードを使用して、指定した単語の正規表現を作成できます。 、が、結果の正規表現パターンが非常に長く、遅くなる可能性があります。

function wordPermutations($word, $minLength = 2) 
{ 
    $perms = array(); 

    for ($start = 0; $start < strlen($word); $start++) 
    { 
     for ($end = strlen($word); $end > $start; $end--) 
     { 
      $perm = substr($word, $start, ($end - $start)); 

      if (strlen($perm) >= $minLength) 
      { 
       $perms[] = $perm; 
      } 
     } 
    } 

    return $perms; 
} 

テストコード:

$perms = wordPermutations('great', 3); // get all permutations of "great" that are 3 or more chars in length 
var_dump($perms); 

echo ('/\b('.implode('|', $perms).')\b/'); 

出力例:

array 
    0 => string 'great' (length=5) 
    1 => string 'grea' (length=4) 
    2 => string 'gre' (length=3) 
    3 => string 'reat' (length=4) 
    4 => string 'rea' (length=3) 
    5 => string 'eat' (length=3) 

/\b(great|grea|gre|reat|rea|eat)\b/ 
1

私はあなたを考えるとあなたが本当に意味していないことを求めています tの任意の部分を検索する場合彼の言葉、あなたは文字通りの手紙を検索します。

検索{ジャック、ジム}

は、名前{J、C、K、I、M}

* Jの*のOHN * 内のすべての文字を検索して、 "ジョンとシェリーはクールです" * NDシェリー*

再*そしてそのためにあなたは、REG-EXを必要としません:)私の意見で

サフィックスツリーはその

のお手伝いをすることができます210

を楽しんでください。

1

Regex.IsMatch()が返すブール値をチェックしてください。

if (Regex.IsMatch(line, "condition") && Regex.IsMatch(line, "conditition2")) 

この行には、正規表現と右揃えの両方があります。

+0

リストに2つ以上の単語が含まれることがありますが、この方法はうまく拡張されません。また、あなたはあなたの '&&'が '||'でなければならないことを意味する単語のうちの一つにマッチする必要があると思います。答え自体には、書式設定、構文、およびスペルについて多くの問題がありましたが、これを修正しようとしました。私の変更を確認してください。 –

関連する問題