以下のようにエスケープされていないシングルの\を含む文字列を引数で受け取って
置換する関数を作りたいです。
引数を渡す側でエスケープしたダブルの\にするなどコントロールはできない前提です。
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"
しかし引数をコントロールせずに関数内だけで置換するには、どうしたらよいでしょうか?
「バクスラ」とはなんでしょう。
SIに行った時に延々と「スラ、スラ」繰り返されて意味が分からなかった時が、ありまぁす。
「バックスラッシュ」です。一応 \(バクスラ)と記載したのですが・・・分かりにくいかもしれませんので修正しました。
オムレツ料理から生卵取り出すのは無理だとおもうんですよね。ストリングリテラルをエスケープ無しで記述して、インタプリタにパースされた時点でもうそれはバックスラッシュじゃなくて1つの制御コードになってるはずだから…
「エスケープされていないシングルの\を含む文字列」の例として挙げた「var path = "fuga\hoge\piyo.png";」が既に間違っているのだから, 答えようがありません.
luckerさん、ありがとうございます。やはりそうでしょうか・・。実は「制御コードになっている」という事を利用して、「\」単体では置換できないが「\a」や「\t」を「/a」「/t」に置換できる事を確認していました。パスに半角英数字しか来ない前提などにすれば、全てを列挙してループ置換するという力技では実は可能かもしれません・・。
defghi1977さん、ありがとうございます。他の方の回答に記載させていただいたのですが、「var path = "fuga\hoge\piyo.png";」は実際にはjavascript外からwindowsのパスを受け取っている状態ですので、引数を渡す側の文字列はコントロール出来ないと記載させていただきました。