2016-04-26 11 views
1

ワイルドカード検索入力を照合しています。それは名前フィールドです。 以下は私がマッチする必要がある条件です。JavaScript RegEx - ワイルドカードを使用する最小文字数

  1. ユーザーは、少なくとも3つの文字の英数字を入力する必要があり、彼は
  2. ワイルドカード検索を実行することを選択した場合、ユーザーは/文字列の先頭や末尾にワイルドカードを入力してmaynotかもしれないが、それはどちらかの側にすることができます。
  3. 単語間にスペースを入れます。

私はマッチする前に文字列をトリミングしていると言いたいと思います。これはこれまで私が試したことです。

  • 誰かXXX、誰かのxxx yyyの - -
  • 失敗合格
  • 誰か* XXX-

    ^[^\W_](\s?\w?)*$|^[^\W_]{3,}(\s?\w?)*\*$|^[\*][^\W_]{3,}(\s?\w?)*$ 
    

    Regular expression visualization

    Debuggex Demo

    以下は、私が試したいくつかの例があります

  • 誰か、誰かから

を渡された。これは私がwant-何の最も近いマッチである。しかし、それはこれらのテストケースのために失敗します。

  • ABのASFは、* - 私は私を知っている、これはpass-ます失敗する* ABCのASF

を - これは*

  • * ABのASF ABCのASFをpass-なり、失敗します少なくとも3文字の英数字で始まり、スペースと英数字を繰り返すという条件があります。

    ここで私は助けが必要です。

    ありがとうございました。

    ^(?:[^\W_]+|\*[^\W_]{3,}|[^\W_]{3,}\*)(?:\s+(?:[^\W_]+|\*[^\W_]{3,}|[^\W_]{3,}\*))*$ 
    

    注:

  • +1

    なぜ正規表現ですか?検証関数はここでうまくいくはずです –

    +0

    正規表現はこれらの状況のた​​めのきれいな解決策であり、私はそれらから学び、stackoverflowコミュニティは常に助けを求めています。 – Lucky

    +0

    - ccf - 私はあなたの答えを正しいものとしてマークしました。申し訳ありませんが、質問にいくつかの混乱があった場合。 Match and Not matchシナリオを追加するために質問を編集します。 – Lucky

    答えて

    1

    アップデート2このパターンが何をすべき:

    /^([a-zA-Z0-9]{3,}[^\n*]*\*?|\*[a-zA-Z0-9]{2,}[^\n*]*|[a-zA-Z0-9]{2}\*)$/gm 
    

    説明:

    ^        # assert start of line 
    (        # 1st capturing group starts   
        [a-zA-Z0-9]{3,}    # match 3+ times alphanumeric characters 
            [^\n*]*  # match 0 or more non-newline and non-star (*) characters 
             \*? # match 0 or one literal star (*) character; 
        |        # OR 
        \*       # match one literal star (*) character 
         [a-zA-Z0-9]{2,}   # match 2+ times alphanumeric characters 
            [^\n*]* # match 0 or more non-newline and non-star (*) characters; 
        |        # OR 
        [a-zA-Z0-9]{2}    # match 2 non-newline and non-star (*) characters 
            \*   # match one literal star (*) character 
    )        # 1st capturing group ends  
    $        # assert end of line 
    

    REGEX 101 DEMO.

    +0

    AB asf *これは3文字で合計として一致する必要があるものです。 – Lucky

    +0

    しかし、条件は「少なくとも3文字の英数字で始まる」です。だから、あなたにはスペースも含まれていますか?また、具体的には、あなたは 'AB asf * - Fails'をしたい、そうですか? – Quinn

    +0

    質問に混乱を招いて申し訳ありませんが、ユーザーがワイルドカードを入力する場合は、文字数は3以上にする必要があります。したがって、AJ S *が良い例です。また、AB asf *は私の正規表現で失敗しているもので、私はそのシナリオを渡したいと思います。 – Lucky

    0

    は、このいずれかを試して、ちょうどあなたの元の正規表現のように[^\W_]代わりの\wを使用します。

    regex101

    しかし、私は、このタスクは正規表現を使用してクリーンな方法で解決することはできないと主張しています。多分、適切なjavascript関数が読みやすくなります。

    0

    私が正しく要件を理解していれば、
    これは機能するかもしれません。私のテストではそうです。

    ^(?:\*[^\W_]{3,}(?:\s*[^\W_]\s*)*|(?:\s*[^\W_]\s*)*[^\W_]{3,}\*|(?:\s*[^\W_]\s*)+)$

    拡張

    ^       # BOS 
    (?:       # One of either --- 
         \*       # Star at beeginning 
         [^\W_]{3,}     # 3 or more words 
         (?: \s* [^\W_] \s*)*   # Any number of word's following spaces 
        |        # or, 
         (?: \s* [^\W_] \s*)*   # Any number of word's following spaces 
         [^\W_]{3,}     # 3 or more words 
         \*       # Star at end 
        |        # or, 
         (?: \s* [^\W_] \s*)+   # Any number of word's following spaces 
    )        # --------- 
    $        # EOS 
    
    +0

    これは合格しなかった* AB Cdcv、ユーザーがAJに入った場合S 'Sastericは有効なエントリーであるので、これは3文字である – Lucky

    +0

    @ラッキー - 正しくフォーマットしましたか?この '* AB Cdcv'はマッチするものではなく、' AJ S'はこの正規表現とマッチします。 – sln

    +0

    私はそれがフォーマットされていないと思う。このシナリオに合格したい。 * AB Cdcv、また、ユーザーがAJ S *を入力して一致する必要がある場合は、明確にするための例を示しました。 – Lucky

    関連する問題