プロが教える店舗&オフィスのセキュリティ対策術

javascriptの検索において、検索パターンを正規表現で指定し、gオプションで全検索とした場合です。
1度目にマッチした文字列のうち一部が、後に続く別の文字列と組み合わさると、新たに検索パターンとマッチする場合、これについてもマッチさせる方法はないでしょうか。

var x = 'ペンギン3年4月5日'.match(/\D\d[年月日]/g);
document.write( x );

これを実行すると、
「ン3年」
しか表示されませんが、
「ン3年」「年4月」「月5日」
の3つとも表示させるようにしたいのです。

A 回答 (3件)

そのコードを私の環境で実行すると


「ン3年」
ではなく
「ン3年,月5日」
となるわ。

それはさておき、「年4月」も取得したいとなると
複雑なコードを書くしかないわ

普通にマッチングを行うと
ペンギン3年4月5日
最初は「ペ」から開始して
「ン3年」を検索し終わると
その次の開始地点は「4」からになっちゃう

なので、開始地点を変えて再度マッチングするように
作らないといけないわ

substringやRegExp.indexを使ってやるしかないわね
めんどくさいけど
    • good
    • 0
この回答へのお礼

例に挙げたコードの実行結果は、確かに
「ン3年,月5日」
でした。すみません。

やはり一筋縄ではいかないのですね。
substringやRegExp.indexで2文字目から再検索という方法、ありがとうございます。

お礼日時:2011/11/07 23:03

あまり深く考えていないのですが、年月日をそれぞれ2個に置き換えてから検索してはどうでしょうか。



var x = 'ペンギン3年4月5日'.replace(/([年月日])/g, '$1$1').match(/\D\d[年月日]/g);
document.write( x );
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/07 23:05

そのような処理ではmatchは不向きですね…。


execなら(イレギュラーな使い方をすることで)何とか対応できます。

var str = "ペンギン3年4月5日";
var reg = /\D\d[年月日]/g;
var x;
while(x = reg.exec(str)) {
document.write(x);
reg.lastIndex--;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/07 23:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!