テキスト内のすべてのコメントを検索する正規表現を作成しようとしています。たとえば、間のすべて/* */
。例:
/* こんにちは */
これを行うと: /\*.*\*/
、奇妙な動作をし、何も表示されません。それの何が問題なのですか?
編集:コメントは複数行にまたがることができます
テキスト内のすべてのコメントを検索する正規表現を作成しようとしています。たとえば、間のすべて/* */
。例:
/* こんにちは */
これを行うと: /\*.*\*/
、奇妙な動作をし、何も表示されません。それの何が問題なのですか?
編集:コメントは複数行にまたがることができます
上記の例とは異なり、複数行にまたがるコメントを一致させようとしていました。デフォルトで.
は、改行とは一致しません。したがって、複数行のコメントと一致させるには、正規表現で複数行モードを有効にする必要があります。
.*?
また、おそらくの代わりにを使用する必要があります.*
。それ以外の場合は、可能な限り最大の一致が作成されます。これは、最初のオープンコメントと最後のクローズコメントの間のすべてになります。
SublimeText2で複数行照合モードを有効にする方法がわかりません。モードとして使用できるかどうかわかりません。ただし、CTRL + Enterを使用して、実際のパターンに改行を挿入できます。だから、私はこの代替案を提案します:
/\*(.|\n)*?\*/
Sublime Text 2がを認識しない場合は\n
、代わりにCTRL+Enterを使用してパターンに改行を挿入することができます\n
。
私は数年前にこの問題に遭遇し、それに関する記事全体を書きました。
非貪欲なマッチングにアクセスできない場合 (すべての正規表現ライブラリが非貪欲をサポートしているわけではありません)、次の正規表現を使用する必要があります。
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
非貪欲なマッチングにアクセスできる場合は、次を使用できます。
/\*(.|[\r\n])*?\*/
また、正規表現はこの問題に対するヒューリスティックにすぎないことに注意してください。正規表現は、何かが正規表現へのコメントのように見えても実際にはそうではない場合をサポートしません。
someString = "An example comment: /* example */";
// The comment around this code has been commented out.
// /*
some_code();
// */
正規表現を使用してプログラミング言語ファイル内のコメントを削除することに関する追加の注意事項。
警告!
これを行う場合、コード内に文字列/*
または文字列の内部がある場合を忘れてはなりません(たとえば、自分のものではない巨大なコードを解析するかどうかはわかりません)。*/
var string = "/*";
したがって、プログラミング言語でドキュメントを解析し、ブール値を使用してオープン文字列の状態を保存するのが最善です (そして、オープン文字列内の一致を無視します)。
で区切られた文字列に"
は を含めることができる\"
ので、正規表現に注意してください。
すべてのコメント、または 1 種類のコメント (単一行または複数行) を正しく検索できる正規表現を作成することはできません。
正規表現は部分一致しか提供できず、おそらくすべてのケースの 90% をカバーするでしょうが、それだけです。
正規表現の構文は非常に複雑であるため、コードのトークン化に基づく完全な式の評価を行うことによってのみ、100% のケースで正しく識別することができます。後者は、現在すべての AST パーサーによって実装されている巨大なタスクです。AST エクスプローラーを参照してください
すべての正規表現がコード内のどこにあるかを正確に知ることができるのは、適切に作成された AST パーサーだけです。それに基づいてパーサーを作成する必要があります。
または、decommentなど、既にすべての機能を備えている既存のライブラリの 1 つを使用することもできます。
コメント ブロックから正規表現を見分けることができず、正面からのアプローチがつまずく正規表現の例:
/\//
- この正規表現は単一行のコメントであると見なされます/\/*/
- この正規表現が複数行のコメントを開くと見なします