• ベストアンサー

javascriptの正規表現で重複して検索

javascriptの検索において、検索パターンを正規表現で指定し、gオプションで全検索とした場合です。 1度目にマッチした文字列のうち一部が、後に続く別の文字列と組み合わさると、新たに検索パターンとマッチする場合、これについてもマッチさせる方法はないでしょうか。 var x = 'ペンギン3年4月5日'.match(/\D\d[年月日]/g); document.write( x ); これを実行すると、 「ン3年」 しか表示されませんが、 「ン3年」「年4月」「月5日」 の3つとも表示させるようにしたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

そのような処理ではmatchは不向きですね…。 execなら(イレギュラーな使い方をすることで)何とか対応できます。 var str = "ペンギン3年4月5日"; var reg = /\D\d[年月日]/g; var x; while(x = reg.exec(str)) { document.write(x); reg.lastIndex--; }

biwa_nya-su
質問者

お礼

不勉強でexecをよく知らなかったのですが、これで行けそうです。 execのリファレンスを今読んでいます。 ありがとうございました。

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

あまり深く考えていないのですが、年月日をそれぞれ2個に置き換えてから検索してはどうでしょうか。 var x = 'ペンギン3年4月5日'.replace(/([年月日])/g, '$1$1').match(/\D\d[年月日]/g); document.write( x );

biwa_nya-su
質問者

お礼

これは考えつきませんでした。 今回の実際のコードは、このあともう少し複雑な置換を何度か行うため、これではさらに手順が増えることになりやや適さない方法でしたが、今後何かで使わせていただくと思います。 ありがとうございます。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

そのコードを私の環境で実行すると 「ン3年」 ではなく 「ン3年,月5日」 となるわ。 それはさておき、「年4月」も取得したいとなると 複雑なコードを書くしかないわ 普通にマッチングを行うと ペンギン3年4月5日 最初は「ペ」から開始して 「ン3年」を検索し終わると その次の開始地点は「4」からになっちゃう なので、開始地点を変えて再度マッチングするように 作らないといけないわ substringやRegExp.indexを使ってやるしかないわね めんどくさいけど

biwa_nya-su
質問者

お礼

例に挙げたコードの実行結果は、確かに 「ン3年,月5日」 でした。すみません。 やはり一筋縄ではいかないのですね。 substringやRegExp.indexで2文字目から再検索という方法、ありがとうございます。