ホーム>source

コンテキストでは、Mongooseとregexを使用して、 find() を使用してデータベース内の文字列を照合しています 。

文字列 {W}{W}{U}{U}{B}{B}{R}{R}{G}{G} の例特定の文字の出現を一致させる必要があります。必要な数の文字がある場合にのみ一致する正規表現を作成しようとしています。

ウィズウィズ=> wwuubbrrgg、ggrrbbuuww、wuwubrbrggなど

ウィズウィズ=> wwu、wuw、uwwなど

私が見つけたソリューションは、文字列の順序がややランダムで、複数の文字が同じ括弧内にある可能性を説明できませんでした: {W}{W}{U}{U}{B}{B}{R}{R}{G}{G} 。そのため、実際の文字のみを考慮し、十分な数の文字が見つかり、存在しない文字に遭遇しない場合にのみ一致させたいと思います。

{W}{W}{U}
あなたの答え
  • 解決した方法 # 1

    正規表現は本当に、本当に数えるのが苦手です。特定の数の特定の文字を特定の順序で必要とすることは、Regexが得意とするものではありません。それは可能ですが、効率の合理的な尺度ではありません。例として、ここにあなたのシナリオで機能する正規表現があります:

    <前>ウィズウィズ

    ご覧のとおり、非常に単純なものには非常に長い時間がかかります。これは、必要な機能があまりパターンではないため、この動作がRegexの設計対象ではないためです。私は個人的に、各キャラクターの出現を通過して単純に数えることをお勧めします。しかし、あなたが正規表現に夢中になっているなら、ここに内訳があります:

    <前>ウィズウィズ

    編集:実際には、この正規表現は次のように少し減らすことができます。

    <前>ウィズウィズ

    基本的に、これは各先読みの最後のネガティブキャプチャグループを取り除くだけです。キャプチャの長さの合計を各文字要件の合計と同じに制限しているため、これは必要ありません。その条件は、特定の文字が2つ以上ないという要件を満たしていることを知るのに十分です。それでも、この問題の正規表現による解決策は避けます。これは、特定の文字の組み合わせに対してこの正規表現を生成して実行するのにかかる時間のように、各文字のインスタンスをカウントして同じ結果が得られる可能性があるためです。

    ^(?=[^wW\n]*[wW][^wW\n]*[wW][^wW\n]*)(?=[^uU\n]*[uU][^uU\n]*[uU][^uU\n]*)(?=[^bB\n]*[bB][^bB\n]*[bB][^bB\n]*)(?=[^rR\n]*[rR][^rR\n]*[rR][^rR\n]*)(?=[^gG\n]*[gG][^gG\n]*[gG][^gG\n]*).{10}$

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ さまざまなタイプのC#インデクサープロパティ