2016-05-09 11 views
1

私は「_」記号で分割され、異なる長さの部分文字列と文字列を持っているし、いくつかのサブ文字列が複数のサブサブ文字列に分割する必要が...正規表現でこれを行うことはできますか?

例:

"_foo-2_bar-12_un[3;1]iver[3]se[3-7]" 

/(?:((?:(?:\[([a-z0-9;-]+)\])|(?<=_)(?:[a-z0-9]+)|-([0-9]+))+))/ig 
:私はこのようなものを作ってみた

"foo-2", "2", "bar-12", "12", "un[3;1]", "3;1", "iv", "er[3]", "3", "se[3-7]", "3-7" 

:このようなグループに分割する必要があります

私が遭遇する問題は最後の部分です。そして、私の周りをうろついた後、私はこれが可能であるかどうかを考え始めました。それは...ですか?

どのようなガイダンスがありがとうございます。と(どちらか[...]部分文字列が内部には[]を有していないと、その後

/[^\W_]+(?:\[([^\][]*)]|-([^_]+))/g 

パターンがどの1+文字の英数字列([^\W_]+)と一致regex demo

を参照してください:

+0

['([^ \ W_] +)?([^] [] *)] | - ([^ _] +)))]](https://regex101.com/r/sA2xC7/2)?捕捉された値はあなたに '' foo-2、2、bar-12,12、un [3; 1]、3; 1、iver [3]、3、se [3-7]、3-7] '。あなたの正規表現の味は何ですか? –

+0

まだ、最後の部分を別々に分割するのではなく、グループ内に四角い括弧を含めません。 (しかし、それでもなお、私のものより良い) 正規表現のフレーバーはECMA-262です。 – Insomnia

+0

['(^ \ W _] +(?:\ [([^ \] [] *)] - _] +))) '](https://regex101.com/r/sA2xC7/3)。 ECMA-262はJS風味を意味するので、ブランチリセットの代わりに非捕捉グループを使用して、どのグループが一致しているかを確認する必要があります。 JSソリューションをお探しですか? –

答えて

1

次の正規表現を使用することができます\[([^\][]*)] - グループ内にある[...]をキャプチャすることに注意してください)、ハイフンに続いて_以外の1文字以上(-はグループ2に取り込まれます)。このコードで

var re = /[^\W_]+(?:\[([^\][]*)]|-([^_]+))/g; 
 
var str = '_foo-2_bar-12_un[3;1]iver[3]se[3-7]'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[0]); 
 
    if (m[1]) { 
 
    res.push(m[1]); 
 
    } else { 
 
    res.push(m[2]); 
 
    } 
 
} 
 

 
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

、一致オブジェクトが各反復で分析された:0番目のグループ(全試合)IASは、グループ1、グループ1が一致した場合、最終的な配列に加え、そしてグループ2が結果の配列に追加されます。