仅匹配第一次和最后一次出现-JavaScript

Matching First and Last Occurrences Only - JavaScript

本文关键字:-JavaScript 最后一次 第一次      更新时间:2023-09-26

所以我正在用JavaScript做一个简单的BBCode解析器,没有什么太花哨的。我首先需要得到一个正则表达式,它将只匹配BBCode,并且只匹配标记的第一次和最后一次出现。这将有助于处理相互嵌套的项目,如

[b][c red]This should output bold red text[/c][/b]

应该解析为

<span style="font-weight: bold;><span style="color: red;">This should output bold red text</span></span>

当前的"Master"regex(检测字符串中是否有BBCode的regex)如下所示。

('[{1}([^'[]{1,3})(| .*?)']{1}(.*?)'[{1}('/{1}[^']]{1,3})']{1})

有没有办法改变这一点,只检测第一场和最后一场比赛?

注意:我想排除诸如[[Main Page]] 的Wiki链接

正则表达式不是该作业的合适工具,就像它不是解析HTML的合适作业一样。这是因为它是一种上下文无关的语言,而不是正则语言(因此正则表达式)。

然而,我永远不会抱怨有人把某件事当作"解决小问题的练习"(这就是我参加SO的原因)。你说我的评论有帮助,所以我会发布它并添加解释。

'[('w{1,3})'](.*)'['/'1']
<$1>$2</$1>

首先,我们寻找[,然后是我们的第一组1-3"单词"字符([a-zA-Z0-9_]),然后是]。这个'w可以替换为[^']],以匹配除括号外的任何字符或您选择的任何其他字符(我不完全确定BBCode规范以及标签可以由什么组成)。然后我们将(贪婪地)将0+字符捕获到另一组中。最后,我们寻找包含我们的第一个捕获组(引用'w{1,3}'1)的[',然后是]。由于我们在(.*)中使用了贪婪捕获,它将一直持续到最后一个结束标记。

现在我们有两个捕获的组,一个带有标签,另一个带有内容。您可以通过简单地引用组将[更改为<<$1>$2</$1>

Regex101