JavaScriptで特定文字に囲まれた複数行の文字を取り出す

JavaScriptである記号に囲まれた複数行の文字を抜き出そうとしたときにつまづいたので、解決法をメモ

たとえば、以下のようなテキストがあるとします。

<data>
<item>ITEM1</item>
<item>ITEM2-1
ITEM2-2
ITEM2-3
ITEM2-4</item>
<item>ITEM3</item>
</data>

ここから、<item>に囲まれた文字を連続して取り出そうとしたときに、次の正規表現が考えられます。

//この部分
var match_result = str.match(/<item>(.*?)<\/item>/g);

for(var idx in match_result){
 alert(match_result[idx]);
} 

しかし、matchメソッドは、行単位でマッチングをかけるため、 ITEM1,ITEM3はマッチしますが、ITEM2に関しては同じ行に<ITEM></ITEM>が無いためマッチしません。
PHPのpreg_matchにある’s’みたいなフラグがあればいいんですけど、matchメソッドにはそんなのありません。

そこで’.*?’としている部分を'[\s\S]*?’のように、空白文字か空白文字以外かでマッチするように指定します。(別に'[\w\W]’でも大丈夫です)
参考元: Stackoverflow (how-to-use-javascript-regex-over-multiple-lines)

前のコードを修正して.*?を[\s\S]*?としてみます。

//この部分
var match_result = str.match(/<item>([\s\S]*?)<\/item>/g);

for(var idx in match_result){
 alert(match_result[idx]);
} 

このように、<item>で囲まれたすべての行にマッチするようになりました。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする