2017-03-14 24 views
-2

次のように、私は正規表現を持っている:コメントを除外する正規表現ですか?

(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(\/\/.*) 

そして、私のテスト文字列を次のように

<? 
/* This is a comment */ 

cout << "Hello World"; // prints Hello World 

/* 
* C++ comments can also 
*/ 

cout << "Hello World"; 

/* Comment out printing of Hello World: 

cout << "Hello World"; // prints Hello World 

*/ 

echo "//This line was not a Comment, but ... "; 
echo "http://stackoverflow.com"; 
echo 'http://stackoverflow.com/you can not match this line'; 
array = ['//', 'no, you can not match this line!!'] 
/* This is * //a comment */ 

https://regex101.com/r/lx2f5F/1

それは、ライン2と一致した4〜9 7、13することができます〜17正しく。

しかし、それはまた、 どのように非貪欲マッチングに?

すべてのヘルプは感謝していただければ幸いです。

+0

regex * for *とは何ですか?なぜ*? – jonrsharpe

+0

あなたがマッチしたくない行が何であるか明確に言及してください...あなたの正規表現からそれを理解しなければならない場合、あなたの正規表現は正しいものでなければならないので、推測の時間を投資するポイントはありません... –

+0

これは質問はすでに答えている、あなたはここを見ることができます! http://stackoverflow.com/a/41867753/2012407 – antoni

答えて

0

私はあなたに新しいベストパターンがあると信じています。
/\/\*[\s\S]*?\*\/|(['"])[\s\S]+?\1(*SKIP)(*FAIL)|\/{2}.*/
これは正確にちょうど683のテキストの次のブロックを処理するステップ:

<? 
/* This is a comment */ 

cout << "Hello World"; // prints Hello World 

/* 
* C++ comments can also 
*/ 

cout << "Hello World"; 

/* Comment out printing of Hello World: 

cout << "Hello World"; // prints Hello World 

*/ 

echo "//This line was not a Comment, but ... "; 
echo "http://stackoverflow.com"; 
echo 'http://stackoverflow.com/you can not match this line'; 
array = ['//', 'no, you can not match this line!!'] 
/* This is * //a comment */ 

パターンの説明:(あなたは空の文字列とコメントサブストリングを置き換えるために下にある置換ボックスを使用することができます* Demo - 効果的*/
その後、すべてのコメント)

/\/\*[\s\S]*?\*\/マッチ\*その後、0個以上の文字を削除|OR
(['"])[\s\S]*?\1(*SKIP)(*FAIL)は一致しないでください'または"その後、1文字以上、その後リード(キャプチャ)文字
|OR
\/{2}.*/マッチ//ゼロまたはそれ以上の非改行文字

[\s\S]を使用すると、.改行文字を許す点を除いて、これは意図的に最初の2つの選択肢で使用されます。 3番目の方法では、改行文字が見つかったときには、意図的に.を使用して停止します。

私は、最も速い選択肢が最初に出てパターンが最適化されるように、すべての選択肢のシーケンスを確認しました。私のパターンは、OPのサンプル入力と正確に一致します。誰かが私のパターンに問題が見つかった場合は、私にそれを修正しようとするコメントを残してください。


月のパターンが正しく使用してステップ1006でのOPの希望する部分文字列のすべてに一致します。~([\'\"])(?<!\\).*?\1(*SKIP)(*FAIL)|(?|(?P<comment>(?s)\/\*.*?\*\/(?-s))|(?P<comment>\/\/.+))~gx

サヒールのパターンは完全にあなたのUPDATEDサンプル入力の最後のコメントを一致させるためにを失敗しました。これは、質問が間違っているか、「あなたが何を求めているのか不明」として閉じなければならないか、またはSahilの答えが間違っていて緑のダニを与えられてはならないことを意味します。あなたがあなたの質問を更新したとき、Sahilが彼の答えを更新するように要求していたはずです。間違った答えがその質問を満たすことができない場合、将来のSOリーダーは混乱しやすく、SOは信頼性の低いリソースになります。

0

との最後の行に単一引用符( ')、二重引用符( ")と配列が一致します。分岐リセット:a working demo on regex101.com
注を参照してください

([\'\"])(?<!\\).*?\1(*SKIP)(*FAIL) 
| 
(?| 
    (?P<comment>(?s)/\*.*?\*/(?-s)) 
    | 
    (?P<comment>//.+) 
) 

PCREあなたは(*SKIP)(*FAIL)メカニズムを使用することができます(?|...)はここでは本当に必要ではありませんが、単にcommentというグループを明確にするために使用されました。

+0

ありがとう、それはうまくいきます。 – kkasp

関連する問題