正規表現構文
/expr/flags
はリテラル構文です。つまり、変数に文字列リテラルの中に変数を含めることはできません。だからあなたの式/r/g
はあなたのr
変数を使用していないので、文字 "r"を探しています。
正規表現を構築する他の方法はRegExp()
コンストラクタである:あなたが変数または文字列リテラルを渡すことができるように
new RegExp(exprString, flags)
パラメータは、文字列です。あなたは.replace()
に正規表現を渡しませんでしたので、
var r = ':-\\)'; // note: need to escape the)
html = html.replace(new RegExp(r, "g"),"<img src=\""+icon_folder+
"/face-"+emoticon+".png\" class=\"emoticonimg\" />");
2番目のコードブロックが働いていた理由がある - それは前方にあなたは自分のr
変数を渡すことを意味リテラル正規表現、のスラッシュがありませんでした。
new RegExp
を使用すると、バックスラッシュが正規表現では特別な意味を持ちますが、文字列内で特別な意味を持つため、正規表現のリテラルよりも多くの手間がかかります。つまり、/\d/
は、new RegExp("\\d")
となります。つまり、バックスラッシュを2倍にする必要があります。 (私はあなたが長い正規表現を取得することができますどのくらい面倒が想像することができると確信しています。)あなたの正規表現はまた、エスケープする必要がある閉じ括弧が含まれているので、あなたの文字列は':-\\)'
として終了します。あなたのr
変数は常にハードコードされた値を持つことになります場合は
は、あなたも言うことができる:
var r = /:-\)/g; // note: have to escape the)
だけ.replace()
にr
を渡すを。
ありがとうございました – AnApprentice
@AnApprenticeよろしくお願いします。 :) –
'var r = /: - \)/ g;のような、おそらくはきれいな正規表現リテラルを使うこともできます。 –