2009-02-20 69 views
1

我想構建一個bbcode解析器,但我在解決如何避免匹配過於廣泛時遇到了一些問題。例如,我想實現一個[名單]來轉換這樣的:正則表達式的字符串分隔

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

將通過這個來代替:

<ul>$1</ul> 

這工作正常,但如果我有兩個列表正則表達式匹配哪裏第一個列表的開始標記和第二個列表的結束標記。因此,這

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

變成這樣:

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

產生真難看輸出。任何想法如何解決這個問題?

+0

更好地構建一個真正的解析器比這個正則表達式僞解析器。至少當你需要嵌套列表時,你會看到正則表達式不是每個問題的答案。 – Gumbo 2009-02-22 22:32:25

回答

4

如果你正在做的不僅僅是一個輕量級的破解,而且更永久的東西,你可能想要轉向一個真正的解析器。 Java中的正則表達式尤其緩慢(即使使用預編譯模式)和匹配嵌套構造(特別是不同嵌套構造,如「foo [u] [i] bar [s] baz [/ s] [/ i] [/ u]」 )將是一場皇家的痛苦。

相反,嘗試使用基於狀態的解析器,它可以反覆地在「foo」/(u)/「[i] bar [s] baz [/ s] [/ i] ]「,並且每當遇到匹配的結構分隔符時都會維護一組翻轉的狀態。

+0

感謝您的高舉,您是否知道一些資源或此類解析器的工作示例?速度真的是我最關心的問題^^ – cdecker 2009-02-21 18:04:08

8

你使用未必會是一個特別好的辦法,但要解決特定問題的方法,只需更改到非貪婪匹配:

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

注意,這樣將有麻煩嵌套列表而不是背對背的列表。