質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

javascriptでシングル\(バックスラッシュ)を置換したい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,326

snr

score 4

以下のようにエスケープされていないシングルの\を含む文字列を引数で受け取って
置換する関数を作りたいです。
引数を渡す側でエスケープしたダブルの\にするなどコントロールはできない前提です。

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"

しかし引数をコントロールせずに関数内だけで置換するには、どうしたらよいでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • defghi1977

    2018/03/31 06:13

    「エスケープされていないシングルの\を含む文字列」の例として挙げた「var path = "fuga\hoge\piyo.png";」が既に間違っているのだから, 答えようがありません.

    キャンセル

  • snr

    2018/04/02 11:44

    luckerさん、ありがとうございます。やはりそうでしょうか・・。実は「制御コードになっている」という事を利用して、「\」単体では置換できないが「\a」や「\t」を「/a」「/t」に置換できる事を確認していました。パスに半角英数字しか来ない前提などにすれば、全てを列挙してループ置換するという力技では実は可能かもしれません・・。

    キャンセル

  • snr

    2018/04/02 11:47

    defghi1977さん、ありがとうございます。他の方の回答に記載させていただいたのですが、「var path = "fuga\hoge\piyo.png";」は実際にはjavascript外からwindowsのパスを受け取っている状態ですので、引数を渡す側の文字列はコントロール出来ないと記載させていただきました。

    キャンセル

回答 2

+3

以下のようにエスケープされていないシングルの\を含む文字列を引数で受け取って
置換する関数を作りたいです。

とありますが, その例として挙げているコード

var path = "fuga\hoge\piyo.png";


の解釈がそもそも間違っています.

「\」は文字列を文字列リテラルとしてコード上に書き下す際の制御文字を目に見える形で記述するために用いるものです(それだけではありませんが). JavaScript実行環境はこの文字を文字列リテラル内に発見すると, そこに何らかの制御コードが含まれているものとして扱うため, 必ずしも文字としての「\」が存在しているわけではありません.存在しないものを存在しているがごとく扱う事自体が矛盾していますから, 正しい議論が出来るはずもありません.


但し, String.rawの挙動については興味深くはあります.

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/raw


今回やりたかった事の意味としては、windowsのディレクトリパスをjavascript外から橋渡しで受け取って、そのパスの区切り文字をlinuxやURL形式で扱う必要があり、/(スラッシュ)に変換したかったという事です。

であれば

var path = "fuga\\hoge\\pily.png"
var replaced = path.replace(/\\/g, "/");


とすれば置換できます.


var path = "fuga\hoge\piyo.png";

が確かにおかしいのですが、javascriptで受け取った際この記載になってしまっているため、
javascriptのコード内だけでなんとか解決できないかと考えていました。

この問題は、残念ながらJavaScript側で解決することはできません. 当該JavaScriptコードを出力しているプログラム(VBじゃね?)側でパス文字列の出力をJavaScriptの文字列リテラル仕様に則った形に修正する必要があります.

もしくは、JavaScriptの影響を受けない場所(例えばHTMLコード部)にパス文字列を出力してもらい, その内容をJavaScript側で読み込むようにします.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 11:36

    ご回答ありがとうございます。
    今回やりたかった事の意味としては、windowsのディレクトリパスをjavascript外から橋渡しで受け取って、そのパスの区切り文字をlinuxやURL形式で扱う必要があり、/(スラッシュ)に変換したかったという事です。

    > var path = "fuga\hoge\piyo.png";

    が確かにおかしいのですが、javascriptでから受け取った際この記載になってしまっているため、
    javascriptのコード内だけでなんとか解決できないかと考えていました。

    キャンセル

0

path のナカミが "fuga\hoge\piyo.png" である、(print(path)してそう表示された)
というのであれば置換の必要は無いです

コード中で
var path = "fuga\hoge\piyo.png";
と記述すれば、pathのナカミは "fugahogepiyo.png"となってしまいます

なぜ "\\" と記述するのかといえば、\ を一つそこに格納したいから、なんですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 11:46

    受け取ったときにその文字列になってるというのは、記述的には
    > var path = "fuga\\hoge\\piyo.png";
    となってるということで、置換のテストをするなら、上の文字列定義でしないとだめです
    それでやってみてください
    シングルバックスラッシュの記述は "\\"となります。

    キャンセル

  • 2018/04/02 11:49

    ああ、JavaScriptを動的に作り出しているコードがJavaScriptのリテラル仕様を知らずに組んじまったんだな.

    キャンセル

  • 2018/04/02 11:51

    確かに、そうかもしれません・・。
    結合のテストまで確認出来ておりませんでしたので、再度確認いたします。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる