(Javascriptの) 正規表現のちょっとした応用。
正規表現を使って、シングルクオテーション、ダブルクオテーションで囲まれた値を取得する関数を作ってみた。
文字列 「 var = "foo" ; 」
のようになっていた場合、変数var の値の文字列である、foo を得たいわけだ。
上記の例では、var の前に、空白があって、var の後ろにも、= の後ろにも不定数の空白がある(あってもよい)。こういう場合に正規表現を使うのがもともとの利用法だろう。
プログラミング上では、str = ' var = "foo" ; ' という設定だ。
(なお、この関数は厳格にしてないので、str = " var = 'foo' " ; のようにな場合も取得できてしまう。要は、シングルクォテーションもダブルクォテーションでもOKな関数)。
// str = ' var = "foo" ; ' ; // この str はたとえば、の場合。
v = getStringVal( str, 'var' ) ;
のように使う。
結果として、
v => foo
が得られるわけだ。この関数では、; は無視している。
match メソッドの使い方の参考にもなる。match メソッドでは、match(...)[0] にマッチした文字列、match(...)[1] に、取得したい値が入る。その取得したい値はどうやって設定するのかというと、正規表現の中で、"...(.*?)..." のように、かっこ () で囲めばいいのだ。括弧の中身に引っかかった「モノ」(検索に引っかかったもの)がmatch(...)[1] に格納される。() はいくつも作れるから、そして match(...)[2] , match(...)[3] .... に次々に格納されてゆくのだ。オー便利。(必要な人にはね)
replace をコメントアウトしてあるのは、はじめこの match(...)[1]の使い方をしらなくて、replace で $1 を使う方法だけを知っていたので、工夫して使っていた名残だ。知らないってこわぁい。
この関数を見ると、RegExp オブジェクトの利用価値がわかる。
/var[ \s\r\n]=[ \s\r\n] ...../ のようにスラッシュで囲んだ形の固定正規表現オブジェクトを使っている限りは、正規表現の中身を動的に変更することができないから、動的に、変数 「var」 の値を取得したい場合(変数名を自由に変えたい場合)に、困難が生じるからだ。
・・・・とはいえ、この関数がやっていることは、かなりコアなプログラマーが必要とするような内容だと思う。
僕は職業プログラマーではないのでわからないが、正式にはこの関数のやりたいことをやりたかったら、たぶんもっとブラッシュアップされ整備されたコードを書かなければいけないと思う。
さて、明日はHTMLタグをストリップする関数を作る。
文字列 「 var = "foo" ; 」
のようになっていた場合、変数var の値の文字列である、foo を得たいわけだ。
上記の例では、var の前に、空白があって、var の後ろにも、= の後ろにも不定数の空白がある(あってもよい)。こういう場合に正規表現を使うのがもともとの利用法だろう。
プログラミング上では、str = ' var = "foo" ; ' という設定だ。
(なお、この関数は厳格にしてないので、str = " var = 'foo' " ; のようにな場合も取得できてしまう。要は、シングルクォテーションもダブルクォテーションでもOKな関数)。
function getStringVal( s , key )
{ var ret = s ; var reg ;
var i = s.indexOf("'")
if( i != -1 && i < s.indexOf("\"" ))
reg = new RegExp( key + "[ \s\r\n\t\f]*?=[ \s\r\n\t\f]*?\'(.*?)\'" ) ;
else
reg = new RegExp( key + "[ \s\r\n\t\f]*?=[ \s\r\n\t\f]*?\"(.*?)\"" ) ;
// var reg = new RegExp( key + "[ \s\r\n\t\f]*?=[ \s\r\n\t\f]*?\"([a-zA-Z0-9_]*?)\"" ) ;
// ↑このようにした方が、得たいものがより具体的。間違いがない。
if( ret.match( reg ))
ret = ret.match(reg)[1] ;
// ret = ret.match(reg)[0].replace( reg , "$1" ) ;
else ret = "" ;
return ret ;
}
// str = ' var = "foo" ; ' ; // この str はたとえば、の場合。
v = getStringVal( str, 'var' ) ;
のように使う。
結果として、
v => foo
が得られるわけだ。この関数では、; は無視している。
match メソッドの使い方の参考にもなる。match メソッドでは、match(...)[0] にマッチした文字列、match(...)[1] に、取得したい値が入る。その取得したい値はどうやって設定するのかというと、正規表現の中で、"...(.*?)..." のように、かっこ () で囲めばいいのだ。括弧の中身に引っかかった「モノ」(検索に引っかかったもの)がmatch(...)[1] に格納される。() はいくつも作れるから、そして match(...)[2] , match(...)[3] .... に次々に格納されてゆくのだ。オー便利。(必要な人にはね)
replace をコメントアウトしてあるのは、はじめこの match(...)[1]の使い方をしらなくて、replace で $1 を使う方法だけを知っていたので、工夫して使っていた名残だ。知らないってこわぁい。
この関数を見ると、RegExp オブジェクトの利用価値がわかる。
/var[ \s\r\n]=[ \s\r\n] ...../ のようにスラッシュで囲んだ形の固定正規表現オブジェクトを使っている限りは、正規表現の中身を動的に変更することができないから、動的に、変数 「var」 の値を取得したい場合(変数名を自由に変えたい場合)に、困難が生じるからだ。
・・・・とはいえ、この関数がやっていることは、かなりコアなプログラマーが必要とするような内容だと思う。
僕は職業プログラマーではないのでわからないが、正式にはこの関数のやりたいことをやりたかったら、たぶんもっとブラッシュアップされ整備されたコードを書かなければいけないと思う。
さて、明日はHTMLタグをストリップする関数を作る。