プログラム中の正規表現を使っている関数で、意図しない動作をする箇所があった。
例えば、次のような関数 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/ を表示させると、
次に /|/ を表示させると、
空文字 または 空文字 ということだったか。 (+_+) つまり、// と変わらないということかぁ。
正規表現の基本 によると、
空文字列(くうもじれつ)とは、何も文字が含まれないの文字列の事です。
数字には0という、何も無いことを示す数字がありますが、それの文字版と思えば良いでしょう。
文字が何も無いのに文字列というのも変な話ですが、長さが0の文字列と考えれば、多少分かりやすいかもしれません。
JavaScript で正規表現を使って確認しておく。
"hoge".replace(/og/, "---");
結果は "h---e"
"hoge".replace(/|/, "---")
結果は ”---hoge”
"hoge".replace(/|/g, "---")
では、結果は “---h---o---g---e---“
0コメント:
コメントを投稿