2016-04-22 23 views
3

JavaScriptの正規表現を使用してファイル名から不正な文字を置き換えようとしていますが、IE 11では '正規表現の構文エラー' ChromeとEdgeで同じコードが正常に動作します。Javascript正規表現がIEで失敗しましたが、ChromeとEdgeで動作しています

String.prototype.replaceAll = function (search, replacement) { 
    var target = this; 
    return target.replace(search, replacement); 
}; 

var filename = 'test+&+this+again.2016.txt'; 

filename = filename.replaceAll(new RegExp(/[^a-zA-Z0-9_\-&.]+/, 'g'), '_'); 

所望の出力は、任意の助けをいただければ幸い

filename = 'test_&_this_again.2016.txt'; 

あります。

おかげ

+0

あなたの 'replaceAll'関数の目的は、単に' replace'を標準と呼んでいるからですか? – sp00m

+0

FWIW: '/ [^ a-zA-Z0-9 _ \ - &。] + /'は '/ [^ \ w \ - &。] + /'と同じです。 –

+0

私は、 .replaceAll'をプロダクションコード:-O – andlrc

答えて

5

ポイントはRegExpコンストラクタはあなたが見るように正規表現オブジェクトリテラルは、すべてのブラウザでサポートされていない受け入れていることです。それは一貫して動作するため

filename = 'test+&+this+again.2016.txt'; 
 
filename = filename.replace(/[^a-zA-Z0-9_&.-]+/g, '_'); 
 
document.body.innerHTML = filename;

:このような共通のコードを使用してください。ブラウザがES6に準拠起動すると、コンストラクタ(source: MDN)内の正規表現オブジェクトリテラルを使用しても支障がありません。

はECMAScriptの6、new RegExp(/ab+c/, 'i')以降ではもはや(TypeError例外をスローしません最初の引数がRegExpで、2番目のflags引数が存在する場合、 "RegExpを別のものから構築するときにフラグを供給できません")。代わりに引数から新しいRegExpが作成されます。

また、私はパターンが動的に構築されていないので、正規表現リテラル表記を使用することをお勧め。 MDNからの推奨は次のとおりです。

リテラル表記は、式が評価されるときの正規表現のコンパイルを提供します。正規表現が一定のままである場合は、リテラル表記を使用してください。

正規表現オブジェクトのコンストラクタ(たとえば、RegExp('ab+c'))は、正規表現の実行時コンパイルを提供します。正規表現パターンが変更されているか、パターンを知らずにユーザー入力などの別のソースからパターンを取得していることがわかっている場合は、コンストラクタ関数を使用します。

1

ダブルエスケープ\\とそれを行う必要があります文字列表現:

filename = filename.replaceAll(new RegExp('[^a-zA-Z0-9_\\-&.]+', 'g'), '_'); 
+0

これは実際には一重引用符ですが、私は同じことを提案するつもりでした。 RegExpコンストラクタに正規表現リテラルを渡すことは、常に技術的に不正確です。おそらく、IE 11だけがそのルールを適用します。 –

+1

文字クラスの最後にハイフンを置く必要はありません。 –

関連する問題