2017-12-07 9 views
2

Javaソースファイル内のすべての複数行コメントを一致させる際に、私はStackOverflow()エラーに遭遇します。一致したコメントがかなり大きいときに起こります。私は多かれ少なかれ2500文字までの限界を突き止めましたが、これは私の環境に固有のものかもしれません。Rascalの正規表現マッチのサイズに制限はありますか?

私がコメントを一致させるために、次の式を使用しています:

/<comment:((\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/))+>/mi 

は、私が知っておくべき試合の大きさにはいくつかの制限があり、または私の正規表現に問題があるのでしょうか?

私のスタックトレースは次のようになります。それは、文字列内の同じ位置に一致する選択肢が含まれてい* -quantifiedキャプチャグループが含まれているよう

|project://Sevo1/src/Volume.rsc|(985,32,<53,12>,<53,44>): StackOverflow() 
    at countLines(|project://Sevo1/src/Volume.rsc|(985,33,<53,12>,<53,45>)) 
    at $root$(|prompt:///|(0,73,<1,0>,<1,73>)) 

答えて

2

Your regexは最適ではありません。 [^*]は、*(改行と一致する)以外の任意の文字に一致し、その後に改行にも一致する[\r\n]があることがわかります。あなたが一致するテキストの塊は、ほとんどが1文字長です(チャンクを(\*+([^*\/]|[\r\n]))とマッチさせている点を除きます)。正規表現エンジンは、ここでそのタスクにうまく対処していないようです。

ネストされた量指定子は、一度に長いチャンクと一致する場合にのみ有効です。

/<comment:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/>/ 

のようにパターンを書き直してください。より効率的になります。 regex demoを参照してください。

詳細

  • \/\* - /*サブ
  • [^*]*\*+ - 0+一つ以上のリテラル*
  • (?:[^\/*][^*]*\*+)*と続く*以外の文字 - の0+配列:
    • [^\/*][^*]*\*+ - ([^/*]と一致)/または*は0+非アスタリスク文字で続かない([^*]*)一個の以上のアスタリスク(\*+)と続い
  • \/ - おそらくそうそこ/
+0

を閉じますマッチ自体のサイズに制限はありません。問題は、StackOverflowエラーを引き起こすバックトラックが多すぎる最適以下のパターンにあります。それは適切な要約ですか? –

+0

これは実際に問題があることを確認するためにスタックトレースを見るのに役立ちます。改良されたreは問題をより早く現われるだろうが、Java正規表現とRascal仮想マシン/インタプリタへの翻訳との間に、Rascal固有のマッピング問題が存在する可能性がある。 – jurgenv

+0

@RubenSteinsまあ、マッチのサイズは確かにマッチを保持する可変型のサイズによって制限されます。しかし、私はあなたに長い間コメントがあるとは思いません。 –