2016-05-09 7 views
2

JavaScriptの正規表現を使用して、JavaScriptのサンプル内のすべてのコメントを削除しようとしています。すべてのコメントを検出するJavaScript正規表現

次のように私が持っている正規表現は次のとおりです。

/((\/\*+)(\*|\s)*([^]*[\*]*)(\*|\s)*(\*+\/))/g 

私はに対してそれを実行しているサンプルがある:あなたの便宜のために

/*basic comment*/ 

console.log('turtle'); 

/********************* 
Fancy liney comment 
*********************/ 

console.log('turtle'); 

/****long basic comment ****/ 

console.log('turtle'); 

/* 
* 
* Oh look, it's one of these... great. 
* 
*/ 

、私はregex101.comで、このデモを作成しました。

真珠の正規表現(PCRE)を使用している場合、regex101で見られるように、これはすべて正常に動作し、4つのコメントがすべて見つかって一致として登録されます。しかし、私はJavaScriptでこれをやっています。regex101のJavaScriptフレーバーを選択すると、ブロック全体が1つの一致として強調表示されます。つまり、コメントを削除するときれいなタートルログが殺されます。どんな助けでも大歓迎です。

+0

この部分は、あなたが思っていることをしていますか? – usr2564301

+3

'var trollString =" aaaand .../*失敗!脆弱な解決策です。とにかく、何かが分からなければ、\/\ * [\ s \ S] *?\ * \/'はもっと簡単に思えます。 –

+1

あなたの '*'を貪欲でないものにしますが、@NiettheDarkAbsolが指摘しているように、これは次のようになります: '[^] * [\ *]' –

答えて

3

ちょうど何が起こっているかを説明します[^]]試合JSで何もません任意の文字として解釈され、PCREで、それは非](として一致を意味し、そこにパターン内の別のエスケープされていない]です)。したがって、JSの文字クラスは[^]であり、PCREでは、正規表現エンジンで見つかった文字クラスは[^]*[\*]です。

あなたがする必要があるのは、文字クラス]をエスケープです:事はJSの正規表現の風味文字クラス内の]場合でも、それをエスケープする必要があり、ある

/((\/\*+)(\*|\s)*([^\]*[\*]*)(\*|\s)*(\*+\/))/g 
        ^^ 

クラスの最初の文字です。 PCREおよび他のほとんどの扇子では、]は、文字クラスの最初の文字であるときにエスケープする必要はありません。

ただし、複数行のコメントと一致する最も効率的なパターンが

/\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//g 

あるthe JS demo

を参照してください。これは、ほぼすべての正規表現の味で同じように機能しますregex demo

を参照してください。

+1

それは良い答え+1ですが、ポールLの答えも素晴らしいです。 – Shafizadeh

+1

完璧なウィクスター、ちょうど完璧。私は自分のコードでそれを突きつけた、私のユニットテストは突然すべて緑色に変わっています、ありがとう! :)フィードバックと答えをくれた皆さん、ありがとう! – apbarratt

1

https://regex101.com/r/kI8iH7/2

PCREとJavascriptの正規表現が異なっ[^]を扱うように見えます。正直言って、私はそれが何をすると思いますか分かりません。通常、文字クラスでは、正面の^はクラスを否定することを意味するので、クラスは実際にすべての文字と一致しますがリストされます。しかし、^がクラス内の最初の文字以外の場合は、それ自体にのみ一致します。 ^がクラス内の唯一の文字であれば、PCREとJavascriptの間に意見の相違があるように思われます。

あなたの場合は、「何にもマッチする」という意味にしたいと思われるので、単にそれをもっと一般的な.*に置き換えただけです。 (私はまた、それに続く文字クラスを取り除きました。クラス内に1つだけ存在することは決してありません。実際のトークンと一致するだけで、1つのトークンを含むクラスと一致する必要はありません)

((\/\*+)(\*|\s)*(.*\**)(\*|\s)*(\*+\/))

+1

* PCREのように見えますが、Javascriptの正規表現は '[^]'をこの正規表現とは違った方法で解析するのとは異なります。 '[^]'は、* JSで何もない文字*を意味します。 –

+0

はい、PCREでは '[^]'は法律ではないようです。代わりに、スニペット '[^] * [\ *]'全体が、​​ ']'、 '*'、 '' '、または' \ * 'のいずれかと一致する、その場合は\\ ')。 –

+1

PCRE '[]'と '[^]'は合法ではなく、ユーザーエラーとみなされ、エラーが生成されます。 JSでは、なぜ、彼らは何も一致しないものとして '[]'を受け入れることを決めました。何もないものにマッチするコンストラクトとして '[^]'を受け入れることにしました。 –

関連する問題