1

私は bbcode パーサーを構築しようとしていますが、一致が広すぎないようにする方法を見つけるのにかなりの問題があります。たとえば、次のように [list] to conversion を実装したいと思います。

\[list\](.*)\[/list\]

これに置き換えられます:

<ul>$1</ul>

これは正常に機能しますが、正規表現が最初のリストの開始タグと 2 番目のリストの終了タグに一致する 2 つのリストがある場合を除きます。したがって、この

[list]list1[/list] [list]list2[/list]

これになります:

<ul>list1[/list] [list]list2</ul>

本当に醜い出力を生成します。これを修正する方法について何か考えはありますか?

4

2 に答える 2

8

あなたが使用している方法は、特に良いアプローチではないかもしれませんが、その特定の問題を解決するには、貪欲でないマッチングに変更するだけです:

\[list\](.*?)\[\/list\]

この方法では、連続したリストではなくネストされたリストで問題が発生することに注意してください。

于 2009-02-20T00:27:00.647 に答える
4

あなたが行っていることが単なる軽量ハックではなく、より永続的なものである場合は、おそらく本物のパーサーに移行したいと思うでしょう。Java の正規表現は特に遅く (プリコンパイルされたパターンであっても)、一致するネストされた構造 (特に"foo [u][i] bar [s]baz[/s][/i][/u]" のような異なるネストされた構造) は、ロイヤルペインになります。

代わりに、「foo」/(u)/「[i] bar [s]baz[/s][/i][/u]」のようなセクションで文を繰り返しカットする状態ベースのパーサーを使用してみてください。一致する構成区切り文字に遭遇するたびに反転する一連の状態を維持します。

于 2009-02-20T01:32:24.810 に答える