JScriptの文字列置換に関する勘違い
昨日、JScriptのreplaceメソッドは、最初に見つかった文字列しか置換されないようなので完全に置換できる関数を自作した。が、これは全くの勘違い。最初に見つかった文字列しか置換しないのは、パラメータの指定が間違っていたからだった。
MSDNによると、replaceメソッドの定義は
function replace(rgExp : RegExp, replaceText : String) : String
となっている。第一引数はRegExpオブジェクトを渡さなければならないようだ。ここでStringを渡していたので最初に見つかった文字列しか置換されていなかったらしい。
文字列から正規表現への変換は行われません。
とのことなので、特殊文字を検索したいときは正規表現に変換してやらなければならない。
以上を踏まえて置換関数を作り直してみた。
/** * 文字列の置換を行う。 * @param srcText 置換処理の対象となる文字列 * @param searchText 検索する文字列 * @param replaceText 置換する文字列 * @param flag フラグ。文字列で指定する。 * g (引数 pattern に指定したパターンと一致する文字列をすべて検索するグローバル検索) * i (大文字小文字を区別しない) * m (複数行検索) * @return 置換処理後の文字列 */ function replaceString(srcText, searchText, replaceText, flag) { var objRegExp; // 検索する文字列を一旦エスケープ searchText = escape(searchText); // "\"を置換する。正規表現に対応するため、"\\"とする。 objRegExp = new RegExp("%5C", "g"); searchText = searchText.replace(objRegExp, "\\\\"); // エスケープした文字列を元に戻す searchText = unescape(searchText); // 正規表現オブジェクト生成 objRegExp = new RegExp(searchText, flag); // 置換実行 return srcText.replace(objRegExp, replaceText); }