ど素人から毛を生やす。<延>

変数.match()でも配列を取得したい!

Web > javascript 2017年10月20日(最終更新:1月前)

どもです。

jsの正規表現で、変数を使用したい場合。
var regexp = new RegExp(正規表現文, 'g');
var result = target.match(regexp)
これで良いはずです。

が、

.match()を使ったとき、本来は括弧でグループ化したところが、
配列になって返ってくるはずなのに。

result[0]しかないよーおっかしーなー!

結論からいうと、余分なフラグが立っていた

× var regexp = new RegExp(正規表現文, 'g');
○ var regexp = new RegExp(正規表現文);

RegExpを解説するサイト様が、どこもかしこも'g'つけてるものだから、
なんか'g'つけるのが当たり前みたいに思ってたけど、この'g'って、

/正規表現/g

のgなのだから、要らないなら付けない方がいいんだよな!

っていうか、このgってなんぞや?

置換するときには使いたいやつ #グローバルマッチ

軽く調べただけだと、「グローバルマッチ」「繰り返しマッチングを行う」などの言葉しか出てこなかったので、きちんと調べてみる。

# 最初のaaだけが置換される
"aabbaabb".replace(/aa/, "cc")
# => 'ccbbaabb'

# すべてのaaが置換される
"aabbaabb".replace(/aa/g, "cc")
# => 'ccbbccbb'

CoffeeScript関連資料[正規表現リファレンス(CoffeeScript)]

アッ。
そーゆーやつか。

こいつを.match()に使うと配列が返ってこなくなる理由は、
調べた限りでは見つけられませんでしたが、
複数回マッチするのであれば、配列の大きさが対象によって変化してしまい、
結局、思った通りの処理ができない可能性が高いですね。

教訓

引数の意味は逐一調べた方が良いね。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)