我有这个RegExp,我不知道它有什么问题
tag = new RegExp('(\['+tag+'=("|'|)(.*?)1\])((?:.|\r?\n)*?)\[/'+tag+']','g');
bbcode标签可以有双引号、单引号或不引号。
[tag="teste"]123[/tag]
[tag='teste']123[/tag]
[tag=teste]123[/tag]
捕获的期望输出:teste
和123
为了匹配可选的引号,它应该是("|'|)
, (["|']*)
或("|'?)
?
字符串
怎么了?首先,让我们纠正字符串
中的语法。你需要定义变量
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到无限次重复,|
被解释为字符类中的文字。相反,("|'?)
匹配单引号、双引号或不匹配。