2017-12-15 7 views
-3

検索条件に一致するタイトルを検索しようとしています。 私の例では、バナナ、リンゴの後に来るので一致しませRegexに複数の単語が含まれています

string exampleTitle = "apple orange banana"; 
string term1 = "app bana"; 
string term2 = "bana app"; 
string pattern1 = @term1.Replace(" ", "*.*") + "*"; //output:app*.*bana* 
string pattern2 = @term2.Replace(" ", "*.*") + "*"; //output:bana*.*app* 

//now test 
bool isMatch1 = Regex.IsMatch(exampleTitle , pattern1) // true 
//now test 
bool isMatch2 = Regex.IsMatch(exampleTitle , pattern2) // false 

以下のようなものしたがってpattern2です。しかし、検索用語の中のすべての単語を順不同で照合するときは、私は真実を知る必要があります。

+0

string pattern1 = "(?=.*"+term1.Replace(" ", ")(?=.*") + ")"; //output:(?=.*app)(?=.*bana) string pattern2 = "(?=.*" + term2.Replace(" ", ")(?=.*") + ")"; //output:(?=.*app)(?=.*bana) 

をあなたはこれでバックトラックと前方検索を制限することができますか?用語を分割し、文字列にすべての用語が含まれているかどうかを確認するだけです。パフォーマンス上の懸念から –

+0

また、なぜですか? –

+0

パフォーマンス上の懸念があるため、正規表現は使用しないでください。あなたのパターンでいくつかの "固定"パターンの前に '。*'を使用している場合は、非正規表現のアプローチを考えてください。バックトラックは、このような任意のパターンでの通常のパフォーマンスの犠牲者です。 –

答えて

0

:この場合には正規表現を使用する理由

string pattern1 = "(?=(?>.*?"+term1.Replace(" ", "))(?=(?>.*?") + "))"; //output:(?=(?>.*?app))(?=(?>.*?bana)) 
string pattern2 = "(?=(?>.*?" + term2.Replace(" ", "))(?=(?>.*?") + "))"; //output:(?=(?>.*?app))(?=(?>.*?bana)) 
+1

@ TommasoBelluzzoの答えがより良いアイデアであり、ほぼ5倍速いことに注意してください。 – NetMage

+0

はい!私はテストしました。私の本当のアプリでは40倍も高速です。 –

4

ここでは正規表現が難しい場合があります。代わりに、このアプローチを使用してください:

String exampleTitle = "apple orange banana"; 
String terms = "app bana"; 
Boolean found = true; 

// let's clean things up for malformed input with RemoveEmptyEntries 
foreach (String term in terms.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)) 
    found &= exampleTitle.Contains(term); 

代わりLINQを使用する:

// let's clean things up for malformed input with RemoveEmptyEntries 
String[] terms = terms_list.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); 
Boolean found = terms.All(term => exampleTitle.Contains(term)); 
+1

LINQを使用して任意の数の用語を処理することをお勧めします。 – NetMage

+0

私はダウンボートしませんでしたが、あなたの最初の答えは2つの言葉のためだけに働きます。 – NetMage

+0

本当ですか? LINQなし?私はあなたがどれくらい長くそれが驚くかもしれないと信じています... – NetMage

-1

検索語の単語のすべてを一致させる際、私は真に必要な任意の順序

なしこれは、より可能性があり

bool isMatch = Regex.IsMatch(exampleTitle, ".*app.*") && Regex.IsMatch(exampleTitle, ".*bana.*); 

他の答えに記載されているように、より適切かもしれない部分文字列マッチングを行うための非正規表現の方法があります。あなたが正規表現の代わりに使用することができます(?=.*app)(?=.*bana)

+0

ありがとうございました。しかし、それは私が必要とする解決策ではありません。私はダイナミックなソリューションを探しています。検索語には複数の単語を含めることができるためです。 –

関連する問題