シンタックス ハイライターを作成しており、String.split を使用して入力文字列からトークンを作成しています。最初の問題は、String.split が大量の空の文字列を作成することです。これにより、他の方法よりもすべてが非常に遅くなります。
たとえば、"***".split(/(\*)/)
-> ["", "*", "", "*", "", "*", ""]
. これを回避する方法はありますか?
もう 1 つの問題は、正規表現自体の表現の優先順位です。C スタイルの複数行コメントを解析しようとしているとしましょう。つまり、/* comment */
. ここで、入力文字列が"/****/"
. 次の正規表現を使用するとうまくいきますが、多くの余分なトークン (およびそれらすべての空の文字列!) が生成されます。
/(\/\*|\*\/|\*)/
より良い方法は/*
、's、*/
's を読み取ってから、残りのすべての*
's を 1 つのトークンで読み取ることです。つまり、上記の文字列のより良い結果は です["/*", "**", "*/"]
。ただし、これを行う正規表現を使用すると、悪い結果が得られます。正規表現は次のようになります/(\/\*|\*\/|\*+)/
。
ただし、この式の結果は次のようになります["/*", "***", "/"]
。これは、最後の部分が貪欲であるため、他の部分から一致を盗むためだと推測しています。
私が見つけた唯一の解決策は、次のように否定された先読み式を作成することでした。
/(\/\*|\*\/|\*+(?!\/)/
これにより、期待どおりの結果が得られますが、他の方法に比べて非常に遅く、大きな文字列に影響します。
これらの問題のいずれかに対する解決策はありますか?