gpt4 book ai didi

javascript - 仅当包含在正则表达式匹配中时才替换正则表达式?

转载 作者:行者123 更新时间:2023-11-29 17:32:07 24 4
gpt4 key购买 nike

我有以下内容:

[list]
[*] test
[*] test
[*] test
[/list]

我想创建一个正则表达式,将其转换为:

<ul>
<li>test</li>
<li>test</li>
<li>test</li>
</ul>

我对正则表达式的了解足以替换简单的标签,但在这种情况下,只有当 li 标签包含在 ul 中时,我才需要替换它们。有没有办法在更换之前进行检查?

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

最佳答案

给定文本:

[*] 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]没有遇到[list]之前

编辑

或者更好的是,按照 Gumbo 对此答案的评论中的建议进行操作:匹配所有 [list] ... [/list]然后替换所有 [*] ...在那些。

关于javascript - 仅当包含在正则表达式匹配中时才替换正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com