38

ユーザーの検索入力に基づいてアイテムを絞り込み、アイテムに対してリストされているキーワードと一致する場合に、プロジェクトの検索機能を構築しようとしています。このために、アイテムのキーワードをdata属性に保存し、正規表現パターンを使用してクエリをこれらのキーワードと照合します。

私は現在、次の表現を使用していますが、これが正しくないことはわかっており、その点についてあなたの助けが必要です:

new RegExp('\\b(' + query + ')', 'gi')))ここで、query は|、ユーザーが入力したクエリの値で区切られています (例: \\b(meat|pasta|dinner))。たとえば、一致が1つしかない場合でも、これは一致を返します-meat

いくつかのコンテキストをスローするために、ここに小さな例を示します。

ユーザーが次のように入力した場合:meat pasta dinnerと の 3 つのキーワードすべてを含むすべてのアイテムをリストする必要がmeat pastaありdinnerます。これらは、入力された順序とは無関係です。

任意の順序で、クエリ内のすべての単語に一致する式を教えてもらえますか?

4

4 に答える 4

65

あなたはこれを達成することができます先読みアサーション

^(?=.*\bmeat\b)(?=.*\bpasta\b)(?=.*\bdinner\b).+

ここでRegexrを参照してください

(?=.*\bmeat\b)正の先読みアサーション\bmeat\bであり、文字列のどこかにあることを保証します。他のキーワードについても同じで、.+実際には文字列全体に一致しますが、アサーションが true の場合のみです。

でも「夕食の肉フーバーパスタ」にも合います

于 2012-12-17T09:51:38.363 に答える
5

あなたの正規表現はかなり良さそうです:

\b(meat|pasta|dinner)\b

一致の長さがキーワードの数 (この場合は 3 つ) と等しいことを確認します。

string.match(re).length === numberOfKeywords

はフラグre付きの正規表現、はデータ、はキーワードの数ですgstringnumberOfKeywords

これは、繰り返されるキーワードがないことを前提としています。

于 2012-12-17T09:11:19.987 に答える
2

受け入れられた回答に基づいて、キーワードの配列から正規表現を構築する単純なJavaメソッドを作成しました

public static String regexIfAllKeywordsExists(String[] keywords) {
    StringBuilder sb = new StringBuilder("^");

    for (String keyword : keywords) {
        sb.append("(?=.*\\b");
        sb.append(keyword);
        sb.append("\\b)");
    }

    sb.append(".+");

    return sb.toString();
}
于 2016-05-31T07:34:38.867 に答える