-2

複数行の C スタイルのコメントでトークンを見つけてコメントから削除するための正規表現を書くのに苦労しています。たとえば、次の変換を行うには:

/*
 * comments
SpecialToken
 * commetns
*/

->

/*
 * comments */
SpecialToken
 /** comments
*/

上記がソースファイル内にある場合はいつでも。

オンライン (http://ostermiller.org/findcomment.html) で、一致する /* */ スタイル コメントの正規表現を見つけました。

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

私の特別なトークンは次のようなものです: \nSpecialToken\n、以前の正規表現を編集して次のようにしました:

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

次に、perl のワンライナーを作成して、コメントから削除しました。

perl -pi -e 'BEGIN{undef $/;} s/(\/\*(?:[^*]|[\r\n]|(?:\*+(?:[^*\/]|[\r\n])))*)\ncloneVerifierMarker_39843829489349873478202370870872077223082\n((?:[^*]|[\r\n]|(?:\*+(?:[^*\/]|[\r\n])))*\*+\/)/$1\*\/\ncloneVerifierMarker_39843829489349873478202370870872077223082\n\/\*$2/g' temp/file

コメントからトークンを削除するという点で機能しますが、特別なトークンがコメントにない場合も拾うようです。例えば:

次のファイルには、2 つの SpecialToken が挿入されています。1 つはコメント内 (34 行目) で、もう 1 つはコメントの外 (2342 行目) です。

http://pastebin.com/Yq185G8g

perl ワンライナーを実行すると、次のようになります。

http://pastebin.com/LYftGBX1

特別なトークンはコメントから正常に削除されますが、2 番目のインスタンスはコメントに含まれていなくても引き続き処理されます。

なぜこれが起こっているのかわかりません:(。

これを行う理由は、ソース コードの変換全体でコードのスライスを追跡する必要があるためです。これらの変換によりコメントが削除されるため、特別なトークンがコメントに挿入されている場合は、それを削除する必要があります。

ご協力いただきありがとうございます :)。

4

1 に答える 1

0

この正規表現を探していると思います:

s/(\/\*)(?:(?!.*?\*\/.*?SpecialToken)(.*?)(SpecialToken)(.*?))(\*\/)/$1$2\*\/$3\/\*$4$5/gs;

ここでコードをテストします。

于 2012-08-15T02:35:53.470 に答える