我有这个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
要匹配可选的引号,它应该是("|'|)
,(["|\']*)
或("|\'?)
?
答案 0 :(得分:1)
首先,让我们更正字符串
中的语法您需要定义var tag
tag = 'tag';
result = new RegExp( <...> );
您在'("|'|) <...> '
中有不合时宜的引号,需要转发为("|\'|)
\1
转义为\\1
现在我们的表达式'(\\['+tag+'=("|\'|)(.*?)\\1\\])((?:.|\\r?\\n)*?)\\[/'+tag+']'
的值为:
(\[tag=("|'|)(.*?)\1\])((?:.|\r?\n)*?)\[/tag]
只有一件事,("|\'|)(.*?)\\1
您使用\1
来匹配与用作开头的引号相同的引号。但是,1表示第一个捕获组(从左到右的第一个括号),但("|'|)
实际上是第二组括号,第二组。您需要做的就是将其更改为\2
。
(\[tag=("|'|)(.*?)\2\])((?:.|\r?\n)*?)\[/tag]
就是这样!
.*?
我会使用[^\]]+
(除“”之外的任何字符)("|'|)
与("|'?)
(?:.|\r?\n)*?
我会使用[\s\S]*?
作为@nhahtdh建议tag = 'tag';
result = new RegExp('(\\['+tag+'=("|\'?)([^\\]]+)\\2\\])([\\s\\S]*?)\\[/'+tag+']','gi');
替代方案: [编辑:来自评论中添加的信息]
result = new RegExp('\\['+tag+'(?:=("|\'?)([^\\]]+)\\1)?\\]([\\s\\S]*?)\\[/'+tag+']', 'gi');
至于你的第二个问题:虽然(["|\']*)
和("|\'?)
都匹配,但后者是你想要匹配的正确方法。 *
查找0到无限重复,|
在字符类中被解释为文字。相反,("|\'?)
匹配单引号,双引号或无引号。