2009年10月8日木曜日

正規表現の空文字列

プログラム中の正規表現を使っている関数で、意図しない動作をする箇所があった。

例えば、次のような関数 replace 。引数で渡された文字列を元に正規表現を作り、マッチする文字列を置き換える。

var replace = function(sentence, word, repl){
    var r = new RegExp(word, "gi");
    return sentence.replace(r, repl);
};

console.log(replace("hogepiyohoge", "hoge", "--"));

結果は、

--piyo--

これは問題ない。しかし、ある条件で次のような文字列が渡っているのに気がつかなかった。

console.log(replace("hogepiyo", "|", "--"));

結果を見て、あれ?と。(@_@;)

--h--o--g--e--p--i--y--o--

 

意図せず関数を呼出したとは言え、正規表現で /|/ って何を表わすんだろ?

strfriend で /a|b/ を表示させると、

091008-004

次に /|/ を表示させると、

091008-005

空文字 または 空文字 ということだったか。 (+_+) つまり、// と変わらないということかぁ。

正規表現の基本 によると、

空文字列(くうもじれつ)とは、何も文字が含まれないの文字列の事です。
数字には0という、何も無いことを示す数字がありますが、それの文字版と思えば良いでしょう。
文字が何も無いのに文字列というのも変な話ですが、長さが0の文字列と考えれば、多少分かりやすいかもしれません。

 

JavaScript で正規表現を使って確認しておく。

"hoge".replace(/og/, "---");   

結果は "h---e"

"hoge".replace(/|/, "---")

結果は ”---hoge”

"hoge".replace(/|/g, "---")

では、結果は “---h---o---g---e---“