2017-05-10 8 views
0

私はこのようなラインを有するの配列を返します。私はそうでした:マッチ関数は、2つの要素の代わりに1

var regex = /(\d+)/; 
var str = '\/Date(1475832958000)\/'; 
console.log(str.match(regex)); 
//["1475832958000", "1475832958000"] 

私は2つの要素の配列を取得します。私はなぜなのか理解していない。助けてください。

+3

正規表現全体を囲む '(キャプチャグループ)'があるので、そうです。 –

+0

'str.match(regex)[0]'は正規表現の完全一致です。 'str.match(regex)[1]'はキャプチャグループの結果です。 – horcrux

+0

ありがとうございます。 –

答えて

1

正規表現で()キャプチャグループを定義しているため。 matchは、位置0の全体正規表現に一致する配列を返します。その後にキャプチャグループ内で後続のエントリと一致するものが続きます。あなたはおそらく、正規表現が/^\/Date\((\d+)\)\/$/こと、そして数として[1]で結果を使用していた

var str = '/Date(1475832958000)/'; 
 
var rex = /^\/Date\((\d+)\)\/$/; 
 
var result = str.match(rex); 
 
if (result) { 
 
    var num = result ? +result[1] : null; 
 
    console.log("Number: " + num); 
 
    var dt = new Date(num); 
 
    console.log("Date: " + dt.toString()); 
 
}

正規表現/^\/Date\((\d+)\)\/$/は意味:

  • ^を - 入力の開始
  • \/Date\( - リテラルテキスト/Date(/をエスケープする必要があります。そうしないと正規表現が終了するため、キャプチャグループを開始するのではなく、(のように(をエスケープする必要があります。
  • (\d+) - 1つ以上の数字をキャプチャするキャプチャグループ。
  • \)\/ - リテラルテキスト)/
  • $ - 入力の終わり

サイドノート:あなたの文字列の\/のリテラル'\/Date(1475832958000)\/'は、それらの上にバックスラッシュは必要ちょうど/のではありません。 '\/Date(1475832958000)\/''/Date(1475832958000)/'はまったく同じ文字列です。

2

正規表現() is using for capturing groupでは、最初の要素は完全一致で、2番目の要素は取得値です。 MDN docsから

全体の一致結果および任意括弧捕捉一致結果を含む配列。一致するものがない場合はnull


あなただけのブラケット内の数を取得したい場合は、(バックスラッシュ、\を追加することによって)括弧をエスケープします。

var regex = /\(\d+\)/; 
 
var str = '\/Date(1475832958000)\/'; 
 
console.log(str.match(regex)); 
 

 
// or in case you just want to get the number 
 
// then use capturing group 
 
var regex1 = /\((\d+)\)/; 
 
console.log(str.match(regex1));

関連する問題