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

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

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

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

正規表現

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

Q&A

解決済

2回答

1971閲覧

メタ文字とエスケープ処理

aaaaaaaa

総合スコア501

JavaScript

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

正規表現

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

0グッド

0クリップ

投稿2016/08/19 11:15

下記のソースは、正規表現にマッチしたらプレイスホルダ{0}と{1}を第二引数以降の文字に入れ替えるソースで、javascript逆引きレシピ65pに載っていたものです。

javascript

1function sprintf(format) { 2 for(var i = 0, len = arguments.length;i < len; i++) { 3 var pattern = new RegExp('\\{' + (i-1) + '\\}','g'); 4 format = format.replace(pattern, arguments[i]); 5 } 6 return format; 7 8 9} 10 11console.log(sprintf('{0}を飼っています。名前は、{1}です。','ハムスター','ウタ'));

上記のソースに使われている正規表現についてなのですが、恐らく**{}をエスケープ処理するためにエスケープ文字の*が使われているのですが、
何故か二つあります。***そのものを使いたいときは、もう一つ
*をくっつけることでエスケープ処理が出来ます。しかし、第一引数を見る限り、
エスケープ処理した
**を使う場面は、見当たりません。書籍には、RegExpを使うときは、***\でエスケープ処理することと書いてありました。
ということは、
\は、正規表現リテラルでいう*なのでしょうか。
また、恐らくエスケープ処理された
*{}内の+は、メタ文字の「一文字以上の繰り返し」を意味する+**なのでしょうか。
**{}内の数字の両隣りに「一文字以上の繰り返し」というメタ文字が必要なのでしょうか。
最後に、同じく
{}**内にアポストロフィが二つありますが、これも何を意味して記述してあるのかが分かりません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

しかし、第一引数を見る限り、エスケープ処理した\を使う場面は、見当たりません。

{をエスケープするために\が必要で、その\を文字列中で指定するために\\と書いています。

ということは、\は、正規表現リテラルでいう\なのでしょうか。

上に書いたように、\を文字列リテラル内で書くときは、\\と書きます。

恐らくエスケープ処理された{}内の+は、

{}内に+はありませんよ。何の話でしょうか?{}の中にあるのは、-1から始まる数です。

同じく{}内にアポストロフィが二つありますが、これも何を意味して記述してあるのかが分かりません。

なるほど。勘違いの箇所が分かりました。RegExpの引数が正規表現だと思ったのですね。
RegExpの引数は文字列です。その引数の文字列が表す正規表現を返します。
例えばi=1の時は、文字列はリテラルで書くと'\\{0\\}'、つまり、\{0\}なので、RegExpの返す値は、/\{0\}/になります。これは、文字列{0}にマッチします。

投稿2016/08/19 13:47

otn

総合スコア84423

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

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

0

エスケープまではよかったんですが、それ以降がわからなくなってしました。

javascript上で正規表現文字列を作成するということは

  • javascriptで文字列を構築しなければならない。
  • 構築された文字列が正しい正規表現でなければならない。

この2つを満たさなければなりません。

と、小難しいことを考えるまでもなく

javascript

1 for(var i = 0, len = arguments.length;i < len; i++) { 2 console.log('\\{' + (i-1) + '\\}'); // これで表示される文字列がどんな文字列か確認してください。 3 var pattern = new RegExp('\\{' + (i-1) + '\\}','g');

上の様に第1引数を、consoleなどに出力してみればいいと思います。
これが正規表現になっているかどうかが重要です。
(ソース上でのパッと見は関係ないのです。)

投稿2016/08/19 12:02

flied_onion

総合スコア2604

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問