ブロックコメントでJava RegExを使用したパターンの検索と置換

これは、ブロックコメントを見つけるために使用される正規表現です。

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

私はちょっと修正する必要があります。ブロックコメントに "may"があり、空白で置き換えられるセミコロン(;)を探します。

現在私はこれをやっている

while (m.find()) {
    if (m.group().contains(";")) {
        replacement = m.group().replaceAll(";", "");
        m.appendReplacement(sb, replacement);
    }
}
m.appendTail(sb);

しかし、私はstr.replaceAllの文で置き換える必要があります。私はメモリの例外を出るので、より効率的です短い何でも。私は同じ例外をスローするために使用されたいくつかの他の正規表現を修正し、うまく動作しています。この正規表現が最適化されることを願っています。

---編集---

これらはあなたがこの正規表現をテストできる文字列です

/* this* is a ;*comment ; */

/* This ; is* 
another
;*block
comment;
;*/

ありがとう

0
@Misha編集した質問をご覧ください。私はサンプルのStringを提供しました。ありがとう
追加された 著者 Ali,
スタックトレースを与える。
追加された 著者 itun,
私は例文を投稿し、それからあなたが望むものを強調することができるなら、あなたに正規表現を書くかもしれません。
追加された 著者 Mikhail,

2 答え

(?s)/\*.+?\*/ regexpを使うのはずっと簡単です。あなたの表現では、あなたの記憶を「食べる」という否定的な先読みを使用します。 そしてあなたのコードはもっとシンプルかもしれません:

while (m.find()) {
    m.appendReplacement(sb, m.group().replace(";","");
}
m.appendTail(sb);
3
追加された
@ AlanMooreあなたはこれを少し説明してもらえますか? "重なり合うエフェクトを含む交互と量子" ..例が参考になるかもしれません。ありがとう
追加された 著者 Ali,
+1(特に、 m.group()。contains( ";")呼び出し)、その正規表現は効率が最適化されているので、変更しません。 私はそれを書いた方法ではありませんが、/\*.+?¥*/よりもはるかに優れているはずです。
追加された 著者 Alan Moore,
これは、1文字だけを先取りしているだけで、アスタリスクが見えた後でのみ表示されます。パフォーマンス面では、先読みは、オーバーラッピングエフェクトを持つ代替と量指定子ほど多くの問題を引き起こしません。それは、原子団がそこにあるのです。
追加された 著者 Alan Moore,
@Ali:この質問は、2つ以上の選択肢が同じ文字を照合することができる場合に、交互に一致する可能性があることを示しています。量指定子については、こちらを参照してください。
追加された 著者 Alan Moore,
私はより良い効率については分かりません。 Lookaheadはメモリの問題、特に入り口の大きなテキストで問題を引き起こす可能性があります。原子力グループはこれをまったく解決できません。
追加された 著者 temple.t,
それから私はメモリ不足のエラーについてのアイデアはありません...
追加された 著者 temple.t,

2つのバリエーションがあります(どちらも試してみてください):

1). Why are you using ?>? I don't know what it means and I don't see a need to use something special here like ?>. Change it to ?:.

2)。あなたのループは無限です。 あなたにはこれが必要です:

    int index = 0;
    while (m.find(index)) {
        if (m.group().contains(";")) {
            replacement = m.group().replaceAll(";", "");
            m.appendReplacement(sb, replacement);
        }
        index = m.end();
    }
0
追加された
(?> ...)は、アトミックグループです。それは最大限の効率が必要です(所有量限定子も有効です)。無限ループではありません。 find()メソッドはマッチ開始位置を単独で追跡します。 find(int)は特殊なケースです。
追加された 著者 Alan Moore,