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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

2回答

26274閲覧

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

snr

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/03/30 14:39

編集2018/03/30 15:17

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

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"

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2018/03/30 14:47

「バクスラ」とはなんでしょう。
退会済みユーザー

退会済みユーザー

2018/03/30 15:16

SIに行った時に延々と「スラ、スラ」繰り返されて意味が分からなかった時が、ありまぁす。
snr

2018/03/30 15:18

「バックスラッシュ」です。一応 \(バクスラ)と記載したのですが・・・分かりにくいかもしれませんので修正しました。
退会済みユーザー

退会済みユーザー

2018/03/30 15:55 編集

オムレツ料理から生卵取り出すのは無理だとおもうんですよね。ストリングリテラルをエスケープ無しで記述して、インタプリタにパースされた時点でもうそれはバックスラッシュじゃなくて1つの制御コードになってるはずだから…
defghi1977

2018/03/30 21:13

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

2018/04/02 02:44

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

2018/04/02 02:47

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

回答2

0

以下のようにエスケープされていないシングルの\を含む文字列を引数で受け取って

置換する関数を作りたいです。

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

JavaScript

1var 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形式で扱う必要があり、/(スラッシュ)に変換したかったという事です。

であれば

JavaScript

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

とすれば置換できます.


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

が確かにおかしいのですが、javascriptで受け取った際この記載になってしまっているため、

javascriptのコード内だけでなんとか解決できないかと考えていました。

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

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

投稿2018/03/30 21:35

編集2018/04/02 02:57
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snr

2018/04/02 02:36

ご回答ありがとうございます。 今回やりたかった事の意味としては、windowsのディレクトリパスをjavascript外から橋渡しで受け取って、そのパスの区切り文字をlinuxやURL形式で扱う必要があり、/(スラッシュ)に変換したかったという事です。 > var path = "fuga\hoge\piyo.png"; が確かにおかしいのですが、javascriptでから受け取った際この記載になってしまっているため、 javascriptのコード内だけでなんとか解決できないかと考えていました。
guest

0

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

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

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

投稿2018/03/30 22:19

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/03/30 23:48

もしかして、 fuga\hoge\piyo.png を fuga\hoge\piyo.png ( "fuga\\hoge\\piyo.png") にしたいってはなし?
snr

2018/04/02 02:47 編集

ご回答ありがとうございます。 今回やりたかった事の意味としては、windowsのディレクトリパスをjavascript外から橋渡しで受け取って、そのパスの区切り文字をlinuxやURL形式で扱う必要があり、/(スラッシュ)に変換したかったという事です。 > var path = "fuga\hoge\piyo.png"; が確かにおかしいのですが、javascriptで受け取った際この記載になってしまっているため、 javascriptのコード内だけでなんとか解決できないかと考えていました。 fuga\hoge\piyo.png にでもする事が出来れば、/(スラッシュ)に変換するなり出来るかと思うのですが、おっしゃるとおり今回のケースでは > var path = "fuga\hoge\piyo.png"; と同義になっていると思いますので、通常のやり方では難しいかと考えておりました。
y_waiwai

2018/04/02 02:46

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

2018/04/02 02:49

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

2018/04/02 02:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問