中的文字:
[*] test1
[list]
[*] test2
[*] test3
[*] test4
[/list]
[*] test5
的正則表達式:
\[\*]\s*([^\r\n]+)(?=((?!\[list])[\s\S])*\[/list])
比賽只[*] test2
,[*] test3
和[*] test4
。但是,如果[list]
可以嵌套,或者需要解析更廣泛的BB類語言集,我會選擇合適的解析器。
完成替換,替換我建議的正則表達式:
<li>$1</li>
,然後替換[list]
與<ul>
和[/list]
與</ul>
(假設[list]
和[/list]
僅用於列表和不存在的意見或字符串文字或其他)。
當running the following snippet:
var text = "[*] test1\n"+
"\n"+
"[list]\n"+
"[*] test2\n"+
"[*] test3\n"+
"[*] test4\n"+
"[/list]\n"+
"\n"+
"[*] test5\n"+
"\n"+
"[list]\n"+
"[*] test6\n"+
"[*] test7\n"+
"[/list]\n"+
"\n"+
"[*] test8";
print(text + "\n============================");
text = text.replace(/\[\*]\s*([^\r\n]+)(?=((?!\[list])[\s\S])*\[\/list])/g, "<li>$1</li>");
text = text.replace(/\[list]/g, "<ul>");
text = text.replace(/\[\/list]/g, "</ul>");
print(text);
印刷有以下內容:
[*] test1
[list]
[*] test2
[*] test3
[*] test4
[/list]
[*] test5
[list]
[*] test6
[*] test7
[/list]
[*] test8
============================
[*] test1
<ul>
<li>test2</li>
<li>test3</li>
<li>test4</li>
</ul>
[*] test5
<ul>
<li>test6</li>
<li>test7</li>
</ul>
[*] test8
一個小的解釋可能是爲了:
\[\*]\s*
子串[*]
後跟零或匹配更多的空白字符;
([^\r\n]+)
吞下線的其餘部分並將其保存在匹配組1中;
(?=((?!\[list])[\s\S])*\[/list])
確保每場比賽1組必須有一個子串[/list]
提前沒有 encoutering一個[list]
編輯
或者更好的,做的濃湯在這個註釋提示回答:全部匹配[list] ... [/list]
,然後全部替換爲[*] ...
。
你想一個BB代碼分析器? – kennytm 2010-05-21 05:58:34
這裏需要一個合適的解析器,這不是正則表達式的工作。 – gregmac 2010-05-21 06:12:31
@gregmac,你不知道。如果列表沒有嵌套,並且除了那些list-thingies需要被替換爲一次動作,那麼正則表達式就沒有問題。但是,如果更廣泛的結構需要替換,或者語言可以獲得遞歸性質,那麼你是對的。但截至目前,信息太少而無法做出判斷。 – 2010-05-21 06:16:35