2017-06-11 14 views
0

私はスペースで区切られた文字列の中に3回現れる数字にマッチする正規表現を作ろうとしています。しかし、私はどのように.match()メソッドとキャプチャグループの仕事を知りません。.matchとキャプチャグループはどのように連携しますか?

let repeatNum = "42 42 42"; 
 
let reRegex = /(\d+)\s\1/; // Change this line 
 
let result = repeatNum.match(reRegex); 
 
console.log(result);

結果は次のとおりです:この配列の最初の要素である理由

["42 42", "42"] 

は、[OK]を私はちょっと理解して "42 42"

は、だから私は、次の持っています。

正規表現:

/(\d+)\s\1/ 

手段は、1つのまたはそれ以上の数とスペースを識別する。その単語をグループ#1に置き、グループ#1と同じスペースの後に別の単語を見つけてください。

私はこの正規表現がダブルワードの例でどのように動作するかを見てきました。しかし、私は同じ数字の3つ以上のためにどのように動作するのかわかりません?

EDIT:結果は42 42 42 42と同じであることがわかりました。今はもっと混乱しています。

+0

私はあなたが尋ねるしようとしているのか理解していません。この投稿には何の疑問もありません。 – melpomene

+0

この[投稿](https://stackoverflow.com/questions/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression)を確認してください。あなたはあなたが必要とするものを手に入れることがあります – Charles

+0

T. J. Crowderは、あなたは文字列全体にマッチすると思っています。もし彼がそれについて間違っているなら、あなたは '" 542 42 429 "'のような文字列と一致しないようにする必要があります。 '\ b'はここで助けます:'/\ b(\ d +)\ s \ 1 \ s \ 1 \ b/' –

答えて

4

JavaScript正規表現オブジェクトにはmatchメソッドがありません。あなたは文字列に1を考えてすることができる:(カシミールらイポリットは質問にあなたのためにそれを変更しました)

let repeatNum = "42 42 42"; 
 
let reRegex = /(\d+)\s\1/; // Change this line 
 
let result = repeatNum.match(reRegex); 
 
console.log(result);

String#match全体的な試合を含む配列を返します。最初のエントリとして、続いて配列内の次のエントリとしてキャプチャグループの内容が続きます。そのため、["42 42", "42"]が得られます。"42 42"は式の全体一致で、"42"は最初の取得グルー​​プの内容です。

全体的な一致が必要な場合は、単に配列の最初のエントリを使用します。

正規表現を3つの文字列にそれぞれスペースで区切って表示することになっています。

あなたの正規表現はそれをしません。 と同じの番号を2回と一致させようとします。

あなたは同じ番号を3回一致させたい場合は、あなただけの別の\s\1必要があります:あなただけのスペースで区切られた数字と一致する場合、最も簡単な事、

let repeatNum = "42 42 42"; 
 
let reRegex = /(\d+)\s\1\s\1/; 
 
let result = repeatNum.match(reRegex); 
 
console.log(result ? result[0] : "No match");

を使用するだけです\d+\s\d+\s\d+

let repeatNum = "42 43 44"; 
 
let reRegex = /\d+\s\d+\s\d+/; 
 
let result = repeatNum.match(reRegex); 
 
console.log(result ? result[0] : "No match");

...あなたが好きなら、あなたが言うこれは、\d+(?:\s\d+){2}を使用することができますが「の2つのインスタンスが続く一連の数字:一連の数字が続く空間」私は結果を出した

let repeatNum = "42 43 44"; 
 
let reRegex = /\d+(?:\s\d+){2}/; 
 
let result = repeatNum.match(reRegex); 
 
console.log(result ? result[0] : "No match");

は、正規表現は、文字列内の一致を見つけるだろう、アンカーなしで42 42 42 42

でも同じです。一致するものが文字列と一致する必要はありません。したがって、上記のいずれかを"42 42 42 42"に対して実行すると、部分文字列と一致するため、"42 42 42"で使用するときと同じことが表示されます。

あなたが最後に開始し、$^を追加し、のみ全体をマッチさせたい場合。これらは入力アサーションの開始/終了です。 (あなたの正規表現に最小限の変更)上記の最初の変更に例えば

、:

let repeatNum = "42 42 42"; 
 
let reRegex = /^(\d+)\s\1\s\1$/; 
 
let result = repeatNum.match(reRegex); 
 
console.log("repeatNum:", result ? result[0] : "No match"); 
 
let repeatNum2 = "42 42 42 42"; 
 
result = repeatNum2.match(reRegex); 
 
console.log("repeatNum2:", result ? result[0] : "No match");

+0

私の質問が混乱している場合は申し訳ありません。私はオンラインコースで課題を出していました。そして命令は泥だった。 – user132522

関連する問題