Javascript 仅当包含正则表达式匹配项时才替换正则表达式?

Javascript 仅当包含正则表达式匹配项时才替换正则表达式?,javascript,regex,Javascript,Regex,我有以下资料: [list] [*] test [*] test [*] test [/list] 我想创建一个正则表达式,将其转换为: <ul> <li>test</li> <li>test</li> <li>test</li> </ul> 我知道regex足以替换简单的标记,但在这种情况下,我只需要替换ul中包含的li标记。更换前有没有办法检查 如果有必要的话,我正在使用JavaScript。

我有以下资料:

[list]
[*] test
[*] test
[*] test
[/list]
我想创建一个正则表达式,将其转换为:

<ul>
<li>test</li>
<li>test</li>
<li>test</li>
</ul>
我知道regex足以替换简单的标记,但在这种情况下,我只需要替换ul中包含的li标记。更换前有没有办法检查

如果有必要的话,我正在使用JavaScript。

给定文本:

[*] test1

[list]
[*] test2
[*] test3
[*] test4
[/list]

[*] test5
正则表达式:

\[\*]\s*([^\r\n]+)(?=((?!\[list])[\s\S])*\[/list])
仅匹配[*]test2、[*]test3和[*]test4。但是如果[list]可以嵌套,或者需要解析一组更广泛的类似BB的语言,我会选择合适的解析器

要进行替换,请将我建议的正则表达式替换为:

<li>$1</li>
印行如下:

[*] 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],而不会遇到[list] 编辑


或者更好的是,按照Gumbo在对这个答案的评论中的建议:匹配所有[列表]。。。[/list],然后替换所有[*]。。。对于巴特·K.的建议,这里有一个更好的方法:

查找所有[列表]…[/list] 对于每个匹配,查找其中的所有[*] 这将确保只替换[列表]…[/list]中的[*]

守则:

str.replace(/\[list]([\s\S]*?)\[\/list]/g, function($0, $1) {
    return "<ul>" + $1.replace(/^ *\[\*] *(.*)/gm, "<li>$1</li>") + "</ul>";
})

这里需要一个合适的解析器,这不是正则表达式的工作。@gregmac,你不知道。如果列表不是嵌套的,并且只需要将这些列表内容替换为一次性操作,那么正则表达式就可以了。但是,如果需要替换一组更广泛的结构,或者该语言具有递归性质,那么您是对的。但到目前为止,信息太少,无法做出判断。你应该采取更系统的方法:搜索每个[列表]…[/list],并替换其中出现的每个[*]。
str.replace(/\[list]([\s\S]*?)\[\/list]/g, function($0, $1) {
    return "<ul>" + $1.replace(/^ *\[\*] *(.*)/gm, "<li>$1</li>") + "</ul>";
})