11

シンタックス ハイライターを作成しており、String.split を使用して入力文字列からトークンを作成しています。最初の問題は、String.split が大量の空の文字列を作成することです。これにより、他の方法よりもすべてが非常に遅くなります。

たとえば、"***".split(/(\*)/)-> ["", "*", "", "*", "", "*", ""]. これを回避する方法はありますか?

もう 1 つの問題は、正規表現自体の表現の優先順位です。C スタイルの複数行コメントを解析しようとしているとしましょう。つまり、/* comment */. ここで、入力文字列が"/****/". 次の正規表現を使用するとうまくいきますが、多くの余分なトークン (およびそれらすべての空の文字列!) が生成されます。

/(\/\*|\*\/|\*)/

より良い方法は/*、's、*/'s を読み取ってから、残りのすべての*'s を 1 つのトークンで読み取ることです。つまり、上記の文字列のより良い結果は です["/*", "**", "*/"]。ただし、これを行う正規表現を使用すると、悪い結果が得られます。正規表現は次のようになります/(\/\*|\*\/|\*+)/

ただし、この式の結果は次のようになります["/*", "***", "/"]。これは、最後の部分が貪欲であるため、他の部分から一致を盗むためだと推測しています。

私が見つけた唯一の解決策は、次のように否定された先読み式を作成することでした。

/(\/\*|\*\/|\*+(?!\/)/

これにより、期待どおりの結果が得られますが、他の方法に比べて非常に遅く、大きな文字列に影響します。

これらの問題のいずれかに対する解決策はありますか?

4

2 に答える 2

2

通常、トークン化にはmatchではなくを使用しsplitます。

> str = "/****/"
"/****/"
> str.match(/(\/\*)(.*?)(\*\/)/)
["/****/", "/*", "**", "*/"]

また、non-greedy 修飾子?が 2 番目の問題を解決する方法にも注意してください。

于 2013-11-12T00:38:21.870 に答える