問題を解いていたらこんな問題が出てきた
文字列の中の数字の合計を計算してね。でも、数字として独立してないものは数として数えないよ。
文章中の数字を数えるだけなら…
const test = 'Dinner is fried chicken for 200 yen bought at 5pm!'
const arr = test.match(/[0-9]+/g);
console.log(arr);//[ '200', '5' ]
//数字を足す
まず、ここで「+」が出てきた
☆「+」ってなんだ??
直前の文字の1文字以上の繰り返しにマッチする /fe+ / だと "fe","fee"にマッチ。"eee"にはマッチしない。
参考:https://qiita.com/iLLviA/items/b6bf680cd2408edd050f
上のソースコードから「+」を抜いてみると
const test = 'Dinner is fried chicken for 200 yen bought at 5pm!'
const arr = test.match(/[0-9]/g);
console.log(arr);//[ '2', '0', '0', '5' ]
数字が一文字ずつ出力された
この例だと数字にマッチして数字が続いている限りは、抽出されるよということ(あってる?)
数字として独立していないものは抽出しないはどうすればいい??
今のままだと[200]と[5]が両方抽出されている
(テキストが5pmとなっていて[5]は独立していない)
調べているとこのような書き方を見つけた
const test = 'Dinner is fried chicken for 200 yen bought at 5pm!'
const arr = test.match(/\b\d+\b/g);
console.log(arr);//[200]
-
「\d+」の部分だけ見てみる
「+」は上記で記載した通り
「\d」は数値にする=[0-9]と同じ
※「\D」にすると数字以外に一致になるらしい
のようだ -
「\b」の部分だけ見てみる
「\b」は単語の先頭と末尾に一致する
参考:https://www.javadrive.jp/regex-basic/meta/index4.html
例えば
- 単語の先頭が一致するか??
const test2 = 'abc def'
const arr2 = test2.match(/\ba/g);//aが先頭である場合のみ
console.log(arr2);[a]
- 単語の末尾に一致するか??
const test3 = 'abc def'
const arr3 = test3.match(/f\b/g);//末尾がfである場合のみ
console.log(arr3);//[f]
再度、独立している数字のみ抜き出すコードを見てみる
const test = 'Dinner is fried chicken for 200 yen bought at 5pm!'
const arr = test.match(/\b\d+\b/g);
console.log(arr);//[200]
改めて見てみると
- 「\d+」となっているから、数値と一致するか
- 「\bxxxx\b」となっているから、先頭と末尾がxxxxと一致しているかどうか
- 組み合わせて、先頭が数字かつ末尾が数字になっているものだけを抽出
していることが分かる