RegExp for BBCode tags javascript



我有这个RegExp,我不知道它有什么问题

tag = new RegExp('(\['+tag+'=("|'|)(.*?)1\])((?:.|\r?\n)*?)\[/'+tag+']','g');

bbcode标签可以有双引号、单引号或不引号。

[tag="teste"]123[/tag]
[tag='teste']123[/tag]
[tag=teste]123[/tag]

捕获的期望输出:teste123

为了匹配可选的引号,它应该是("|'|), (["|']*)("|'?) ?

字符串

怎么了?

首先,让我们纠正字符串

中的语法。
  • 你需要定义变量tag

    tag = 'tag';
    result = new RegExp( <...>  );
    
  • 您在'("|'|) <...> '中有不平衡的引号,需要转义为("|'|)

  • 同时,将1转义为\1

现在我们有了表达式'(\['+tag+'=("|'|)(.*?)\1\])((?:.|\r?\n)*?)\[/'+tag+']',它的值是:

([tag=("|'|)(.*?)1])((?:.|r?n)*?)[/tag]

RegEx有什么问题

实际上只有一件事,在("|'|)(.*?)\1中,您使用1来匹配与用作开始的引号相同的引号。然而,1指的是第一个捕获组(从左到右的第一个括号),但("|'|)实际上是第二组括号,即第二组。你所需要做的就是把它改成2

([tag=("|'|)(.*?)2])((?:.|r?n)*?)[/tag]

就是这样!

让我们添加一些最后的建议

  • 我将使用[^]]+代替.*?(除了"]"以外的任何字符)
  • 使用i修饰符(不区分大小写匹配,对于"[tag]…[/tag] ")
  • ("|'|)("|'?)相同
  • 代替(?:.|r?n)*?,我会使用[sS]*?作为@nhahtdh建议的

代码:

tag = 'tag';
result = new RegExp('(\['+tag+'=("|'?)([^\]]+)\2\])([\s\S]*?)\[/'+tag+']','gi');

Alternative: [EDIT: from info added in comments]

result = new RegExp('\['+tag+'(?:=("|'?)([^\]]+)\1)?\]([\s\S]*?)\[/'+tag+']', 'gi');

至于你的第二个问题:虽然(["|']*)("|'?)都将匹配,但后者是你想要匹配的正确方式。*查找0到无限次重复,|被解释为字符类中的文字。相反,("|'?)匹配单引号、双引号或不匹配。

最新更新