プロが教えるわが家の防犯対策術!

下記、正規表現の意味を教えてください

var x = new RegExp('[\\?&]' + hoge);



■調べてみた限りでは下記のような感じだと思うのですが…
\?
・0文字または1文字の\

[\?]
・「0文字または1文字の\」の何れか

[\?&]
・「0文字または1文字の\」の何れか、の最後にマッチ

[\\?&]
・最初の\はエスケープ

new RegExp('[\\?&]' + hoge);
・引数で受け取った文字列の最後の\をエスケープした内容にhogeを追加した文字列を返す

A 回答 (3件)

概ね、#1の方が仰るとおりですが、一つだけ訂正事項があります。



[] は "\" と "]" と "^" (先頭に限る) 以外はエスケープせずともメタキャラクタとして扱われません。
ただし、文字列リテラルとして扱う場合は "\" がメタキャラクタとなる為、new RegExp 内で "\\" を表現する為には "\\\\" と記述する必要があります(文字列リテラル、正規表現で2回エスケープが発生する為)。
従って、new RegExp('[\\?&]') は "?" または "&" にマッチする正規表現となります。

console.log(new RegExp('[\\?&]').test('\\')); // false
console.log(new RegExp('[\\?&]').test('?')); // true
console.log(new RegExp('[\\?&]').test('&')); // true

文字クラス内の "\\" は後続文字をエスケープする意味しかもたず、この場合はなくても結果が変わりません。
コード製作者のミスと思われます。

# Re: re97さん
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>new RegExp 内で "\\" を表現する為には "\\\\" と記述する必要があります(文字列リテラル、正規表現で2回エスケープが発生する為
・正規表現難しいですね(内容もそうですが、検索しづらいという意味においても)
・大変参考になりましたー

お礼日時:2014/11/19 18:17

[]内では多くの特殊文字が普通の文字として解釈されます。

    • good
    • 0
この回答へのお礼

回答ありがとうございました。
・参考になりましたー

お礼日時:2014/11/19 18:10

ちゃう。

文字列を解析する順番がちがう。

・まず […] は…のうちのいずれかの文字。
・つぎに […] の中の \\?& を *頭から* 見て上記の…にあたる文字が何かをみる。
 ・1文字目は \ だから次の文字と合わせて解釈する。次の文字は \ だから、これは '\' という文字そのもの。
 ・3文字目は ?。[] の外ならば前の表現が0~1回現れるという意味だが [] の中なのでそのままの '?' という文字。
 ・4文字目は &。そのまま '&' となる。

つまり '[\\?&]' は、 「'\', '?' , '&' の内のいずれかの文字」という意味になる。
それに hoge の内容がつけ加わるから、「'\', '?' , '&' の内のいずれかの文字に続けて hoge の内容が並んでいる」という意味になる。
    • good
    • 0
この回答へのお礼

回答&詳細な解説ありがとうございました。

>文字列を解析する順番がちがう
・どういう風に考えたらよいかが分かりました
・大変参考になりましたー

お礼日時:2014/11/19 18:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!