2017-11-22 15 views
1

文字列からデータを抽出する正規表現を作成しようとしています。私のサンプルストリング:dn1:pts-sc1.1。私が期待しているデータのフォーマット:['pts', 'sc', '1.1']したがって、基本的にすべての文字は:の後に続き、最後から数えます。JS Regex複数のキャプチャグループがすべての一致を返します

/^[^:]+:(?:([a-z]+)-?)+([\d\.]+)$/g

残念ながら、それは手紙の最後のセットを返します。私have right nowは何

['sc', '1.1']

Iはまた、最初のキャプチャグループに+を追加しようとした:

/^[^:]+:(?:([a-z]+)+-?)+([\d\.]+)$/g

同じで結果。その正規表現の違いだけが私にこのコメントを与えます:

繰り返しキャプチャグループは、最後の反復だけをキャプチャします。

:あなたは、データ入力文字列の

--edit

例では興味がない代わりに、場合すべての反復を捕獲または非キャプチャグループを使用することを繰り返し、グループの周りのキャプチャグループを置きます

  • dn2.33:sc-pts-tt-as3.43
  • dn2.33:sc3.43
  • dn2.33:sc-tt-as3.43

基本的に私は文字グループの数を知らない。

+1

グループの任意の数を取得できない場合があります。その数はパターン内のキャプチャグループの数で指定します。 ['/^[^:]+:([az]+)-([az]+)([\d.]+)$/'](https://regex101.com/r/xhUe8z)/1)? –

+0

@WiktorStribiżew私は編集にいくつかの追加情報を追加しました。 – Quba

答えて

1

グループの任意の数を取得できない場合があります。グループの数は、パターン内のキャプチャグループの数で指定します。あなたが代わりに一致するとキャプチャ-区切られた値を1グループにして、個々の項目を取得し、動的に結果を構築するために-でそれを分割することがあります。

var strs = ['dn2.33:sc-pts-tt-as3.43','dn2.33:sc3.43','dn2.33:sc-tt-as3.43']; 
 
var rx = /^[^:]+:([a-z]+(?:-[a-z]+)*)([\d.]+)$/; // Define the regex 
 
for (var s of strs) { 
 
    var res = [];    // The resulting array variable 
 
    var m = rx.exec(s);  // Run the regex search 
 
    if (m) {     // If there is a match... 
 
    res = m[1].split('-'); // Split Group 1 value with - and assign to res 
 
    res.push(m[2]);   // Add Group 2 value to the resulting array 
 
    } 
 
    console.log(s, "=>", res); 
 
}

パターン - ^[^:]+:([a-z]+(?:-[a-z]+)*)([\d.]+)$は - 一致します次

  • ^ - 文字列の先頭
  • [^:]+から:
  • :以外1+文字 -
  • ([a-z]+(?:-[a-z]+)*)コロン - グループ1(それはabc-def-ghijになります...):1つ以上の文字の後に、-の0以上の連続したシーケンスと1 +文字(パターンを大文字と小文字を区別しないように修飾子を追加します)
  • ([\d.]+) - グループ2(結果の配列にちょうど "プッシュ"することができますm[2]):1桁以上または.
  • $ - 文字列の末尾。
関連する問題