匹配首次和最后一次出现 - JavaScript

时间:2014-04-09 16:30:50

标签: javascript regex

所以我在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”正则表达式(检测字符串中是否有任何BBCode的正则表达式)如下所示。

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

有没有办法改变这个,以便只检测第一个和最后一个匹配?

注意:我想要排除诸如[[Main Page]]

之类的wikilink

1 个答案:

答案 0 :(得分:0)

正则表达式不适合作业,就像它不适合parsing HTML一样。这是因为它是context-free语言而不是regular语言(因此常规表达式)。

但是,我永远不会抱怨某人从事某项工作“小问题解决练习”(这就是为什么我会这样做)。你说我的评论有帮助,所以我会发布并添加解释。

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

首先,我们查找[,然后是1-3“字”字符([a-zA-Z0-9_])的第一个捕获组,然后是]。这个\w可以替换为[^\]]以匹配任何字符,但是匹配括号或您选择的其他任何字符(我不完全确定BBCode规范以及标记可以包含的内容)。然后我们(贪婪地)将0+个字符捕获到另一个组中。最后,我们会找到一个[\,其中包含我们的第一个捕获组(\1引用\w{1,3}),后跟]。由于我们使用了(.*)的贪婪捕获,因此它会一直持续到 last 结束标记。

现在我们有2个捕获的组,一个带有标签,另一个带有内容。您只需引用群组即可将[更改为<<$1>$2</$1>

Regex101