2016-05-01 2 views
1

質問タイトルがちょっと混乱していたら申し訳ありませんが、ここでは私の混乱について詳述します。RegExが1つのマッチで複数のマッチングを行うのは普通ですか?

りんご、オレンジ、マンゴー、リンゴ(任意の数または空を持つことができます)、オレンジ[(任意の数または空を持つことができます])に一致する正規表現を使用します。 (マンゴーには[]はない)。

  • オレンジ色にマッチした

    1. リンゴが
    2. リンゴ[] MATCHED
    3. オレンジ[] MATCHED
    4. リンゴにマッチした[15]
    5. リンゴにマッチした[05]:ここでは有効な例をいくつか紹介しますマッチしない(番号は0で始まらないので)
    6. マンゴー[] NOT MATCHED(マンゴーは[]を持つことができないため)

    は、ここで私が思い付くの正規表現です:

    /^(mango|(apple|orange)(\[[1-9][0-9]*\])?)$ 
    

    この正規表現は動作しますが、通常は1以上のマッチンググループを提供します。例えばapple[15]は、実は、私は多くのグループを作成する()多くを持っているように動作は正常ですが、私はこの正規を構築するために正しい方法を使用していた場合、私は疑問に思う 1. apple[15] 2. apple[15] 3. [15]

    を与えます表現? 1回の試合ではあまりにも多くの結果が出るだけです。

    また、この正規表現を最適化する方法はありますか?この正規表現はかなり単純ですが、複雑であるようです。

    ありがとうございます。

  • +1

    サブグループと一致させたくない場合は、キャプチャしないグループ化を使用してください。 '(?:ABC)' – timolawl

    答えて

    1

    ()はサブグループと一致しているためです。一致させることなく項目をまとめてグループ化する場合は、non-capturing groups(?:)を使用します。たとえば、(?:apple|orange)はリンゴまたはオレンジに一致しますが、出力するグループはキャプチャされません。

    次の操作を行い、唯一のサブグループなしでマッチ全体をキャプチャしたい場合:

    ^mango$|^(?:apple|orange)(?:\[(?:[1-9][0-9]*)?\])?$ 
    

    Regex101

    var strArr = [ 'apple', 
     
    'orange', 
     
    'apple[]', 
     
    'orange[]', 
     
    'apple[15]', 
     
    'apple[05]', 
     
    'mango[]', 
     
    'mango' ]; 
     
    
     
    var re = /^mango$|^(?:apple|orange)(?:\[(?:[1-9][0-9]*)?\])?$/; 
     
    
     
    strArr.forEach(function(str) { 
     
        document.body.insertAdjacentHTML('beforeend', str + ' - match? ' + re.test(str) + '<br>'); 
     
    });

    鉄道ダイアグラム:

    enter image description here

    +0

    あなたの式はまったくマッチしません。かっこで囲む必要があります。 –

    +0

    @ i - そうではありません。正規表現全体がユースケースにマッチします。すべてのサブグループは、サブグループの一致または置換のためのものです。 – timolawl

    +0

    同意すると、ちょうどその質問は、マッチングするグループについて話しているようですが、あまりにも多くのグループが正確であると言われました。 –

    0

    正規表現では、(G1 |(G2)(G3))を宣言しています。あなたはmangoなどを持っていない限り、あなたは不定となります上記の#2を除いて、同じ結果を得るだろう/^(mango)|(apple|orange)(\[[1-9][0-9]*\])?$/する正規表現を変更した場合

    1. apple[15] The whole match 
    2. apple[15] G1 (mango|(apple|orange)(\[1-9][0-9]*\])?) 
    3. apple G2 (apple|orange) 
    4. [15] G3 (\[[1-9][0-9]*\])? 
    

    :あなたが一致したときには、4つの値を持つ配列を取得理由はここにあります入力パラメータ式はまだmango[123]を受け付けますが、一致には数値は含まれません。

    関連する問題