以下のようにエスケープされていないシングルの\を含む文字列を引数で受け取って
置換する関数を作りたいです。
引数を渡す側でエスケープしたダブルの\にするなどコントロールはできない前提です。
var path = "fuga\hoge\piyo.png"; var replacePath = rep(path); function rep(str) { // \を/に変換 return replaceStr; // "fuga/hoge/piyo.png" }
◆試したこと
①RegExpで置換したが、\hogeなどは\hとして制御文字のエスケープとして認識され、
\hは制御文字として存在しないため、出力時\は無いものとして扱われた。("fugahogepiyo.png")
また\fugaの場合は\fが存在するようで、\f自体が出力時制御文字として扱われた。(hogeugapiyo.png")
var sourceStr = val; var targetStr = "\\"; var regExp = new RegExp(targetStr,"g"); var replaceStr = sourceStr.replace(regExp,"/"); // "fugahogepiyo.png"
②制御文字として認識されないよう、String.rawを使った。
結果は変わらず。
var sourceStr = String.raw({raw: [val]}); var targetStr = String.raw`\`; var regExp = new RegExp(targetStr,"g"); var replaceStr = sourceStr.replace(regExp,"/"); // "fugahogepiyo.png"
③引数のvalを使わずに②の状態でString.rawに直接文字列を入れたところ、成功。
また、引数のpath宣言時にString.rawを使った場合も同じく成功した。
var sourceStr = String.raw`fuga\hoge\piyo.png`; var targetStr = String.raw`\`; var regExp = new RegExp(targetStr,"g"); var replaceStr = sourceStr.replace(regExp,"/"); // "fuga/hoge/piyo.png"
しかし引数をコントロールせずに関数内だけで置換するには、どうしたらよいでしょうか?