4

問題は、コメントの両側のすべてのテキストを一致させ、コメント自体を除外したいということです。

「コメント」関連の正規表現の投稿はたくさんありますが、ほとんどは他の言語で書かれており (私はメモ帳++を使用していますが、これはウィキペディアが POSIX ERE であると言っています。言語やツールについては議論しないでください)、ほとんどはコメントを見つけることに焦点を当てています。すでに行われています。

これにより、私が望む包括的なテキストが見つかります(これには、一致に内部ブロックコメントが含まれます):

(^)rule ((.|\n|\r)*?)(^)end

上記は、'rule' と 'end' の間 (両端を含む) を検索します。罰金。

これにより、ブロック コメントが検索されます。

(?:/\*(?:(?:[^*]|\*(?!/))*)\*/)

上記は、 ~ の間 (両端を含む) を検索し/*ます*/。罰金。*/私の場合は問題ではなく、コメント内に 1 つあるかどうかは気にしません。

ここで問題は、ブロック コメントを上記のポジティブ ルール マッチの途中でネガティブに配置して、コメント付きテキストRULEとそれ以外のすべてにマッチさせるにはどうすればよいかということです。END

回答に 1 行の//コメントも含まれていない場合はボーナス ポイントです。

4

2 に答える 2

1

言い始めましょう: 正規表現はこれを行うために作られているわけではありません!

しかし、それは不可能ではありません: 再帰的な正規表現で行うことができます:

  • 「ルール」から「終了」まで、またはコメントブロックの開始までのすべてに一致し、その後さらにすべてが「終了」に一致するか、コメントブロックの開始に一致し、さらにすべてが「終了」に一致するか、など.

もちろん、「すべて」をキャプチャするだけです

つまり、次のようになります。

^rule((?:.|\r|\n)*?)(?:^end|(?:(?://$|/\*(?:(?:[^*]|\*(?!/))*)\*/)))
                                                                  ^
                                                             put cursor there
                                                              and insert
                           ((?:.|\r|\n)*?)(?:^end|(?:(?://$|/\*(?:(?:[^*]|\*(?!/))*)\*/)))
                                                                or end with
                           (?:\r?\n^end)

次に置き換えます

$1$2$3$4$..

置換の数は再帰の数と一致する必要があります

Notepad++ の制限をテストするために、このフィドルを作成しました。

http://jsfiddle.net/lovinglobo/wPKjb/

Notepad++ は、単に「無効な正規表現です」と言うだけで、29 回以上の再帰で中断します。

于 2013-01-24T22:07:59.867 に答える
0

要件を反転し、代わりにソースからすべてのコメントを削除できる場合は、このパターンを使用してコメント (ブロックと行の両方) を一致させることができます。

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s
于 2013-03-06T15:35:00.267 に答える