2009-06-08 4 views
0

"スキー"にはマッチさせるが、 "ウォータースキー"には使用できない正規表現の仕組みは何ですか?どのような正規表現の仕組みが "ski"にマッチしますが、 "water ski"には一致しませんか?

または「スキー」にはマッチしますが、「スキー販売」にはマッチしませんか?

簡単な説明が含まれていますか?

更新:たとえば、「2009 ski competition」には一致しますが、「2009 water ski competition」には一致できません。

+3

どの単語が一致する必要がありますか一致しないはずですか?あなたは「スキー販売」を望んでいませんが、なぜ「スキー競技」は大丈夫ですか?除外基準は何ですか? –

+0

これは単なる例です。私はスキーという単語を持っている文書の中のすべての文字列を見つけたいと思うが、私は "スキー販売"に興味がないことを知っている。 –

答えて

11

更新された部分については、ネガティブ・ルック・バック・ビハインドを使用する必要があります。何かのように

(?<!water\s*)(ski\b) 

これは水が前の単語ではない単語skiに一致する必要があります。

編集:私は上記の正規表現を微調整しました。逆参照ではなく、逆参照を意味します。スキーとスキー競技ではなく、スキー販売では、ネガティブなルックアヘッドが必要です。例:

(\bski)(?!\s*sale) 

さらに詳しい説明はhttp://www.regular-expressions.info/lookaround.htmlを参照してください。

+0

lookbehindをサポートするほとんどのregexエンジンは、可変長のlookbehindをサポートしていないので、\ s *は動作しそうにありません。 – ysth

+0

これは.NET上で動作します。 http://www.regular-expressions.info/refflavors.htmlを参照してください。 OPが特定のエンジンの回答を求めている場合は、そう言います。 –

+0

lookbehindをサポートするほとんどのregexエンジンは可変長のlookbehindをサポートしています。だから、\ s *の回避策は、代わりに\ s {0,100}を使うことです(あるいは、100を安全な値にするだけです)。 –

0

マルチパス検索では、まず水上スキーとスキー販売のすべてのインスタンスをストリングから削除し、その上でIsMatchを実行します。 C#では、このようになります。

string line = Console.ReadLine(); 
line = Regex.Replace(line, "water ski", ""); 
line = Regex.Replace("ski sale", ""); 
bool matchFound = line.IsMatch("ski"); 
関連する問題