23

私は例えばのための文字列を持っています

String src = "How are things today /* this is comment *\*/ and is your code  /*\* this is another comment */ working?"

文字列から部分文字列を削除/* this is comment *\*/ したい。/** this is another comment */src

正規表現を使用しようとしましたが、経験が少ないために失敗しました。

4

7 に答える 7

52

最高の複数行コメントの正規表現は、(?s)/\*.*?\*/次のように展開されたバージョンです。

String pat = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/";

regex101.com で正規表現のデモと説明を参照してください。

要するに、

  • /\*- コメントの先頭に一致/*
  • [^*]*\*+*- 1+ リテラルが続く以外の 0+ 文字に一致*
  • (?:[^/*][^*]*\*+)*- 次の 0+ シーケンス:
    • [^/*][^*]*\*+- /orではない*(と一致する[^/*]) 0 個以上の非アスタリスク文字 ( [^*]*) の後に 1 個以上のアスタリスク ( ) が\*+続く
  • /- 閉鎖/

David の正規表現では、サンプル文字列で一致を見つけるのに26 ステップが必要ですが、私の正規表現では12 ステップしか必要ありません。入力が膨大な場合、David の正規表現は、スタック オーバーフローの問題などで失敗する可能性があります。これは.*?、正規表現エンジンが実行する各場所での遅延パターン拡張が原因で、遅延ドット マッチングが非効率的であるのに対し、私のパターンはテキストの線形チャンクを一度にマッチングするためです。

于 2016-03-31T09:06:36.303 に答える
20

この正規表現を使用してみてください (1 行のコメントのみ):

String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("/\\*.*?\\*/","");//single line comments
System.out.println(result);

REGEX の説明:

文字「/」を文字通り一致させる

文字「*」に文字通り一致

「。」任意の 1 文字に一致

「*?」ゼロ回から無制限の回数、できるだけ少ない回数、必要に応じて拡張 (遅延)

文字「*」に文字通り一致

文字「/」を文字通り一致させる

別の方法として、 (?s)を追加することによる単一行および複数行のコメントの正規表現を次に示します。

//note the added \n which wont work with previous regex
String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("(?s)/\\*.*?\\*/","");
System.out.println(result);

参照:

于 2012-10-22T15:46:48.943 に答える
-1
System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", ""));

非貪欲量指定子を使用する必要がありますか? 正規表現を機能させるために。「?」も追加しました。正規表現の最後で、1 つのスペースを削除します。

于 2012-10-22T15:59:44.230 に答える
-1

私のために働いたこれを試してください:

System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));
于 2018-03-10T22:07:59.510 に答える