【问题标题】:RegExp for BBCode tags javascript用于 BBCode 标签的正则表达式 javascript
【发布时间】:2015-09-03 23:58:49
【问题描述】:

我有这个正则表达式,但我不知道它有什么问题

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

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

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

捕获中所需的输出:teste123

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

【问题讨论】:

  • 只是一些语法错误:new RegExp('(\\['+tag+'=(["\']|)(.*?)\\1\\])([\\s\\S]*?)\\[/'+tag+']','g');。我还将((?:.|\\r?\\n)*?) 更改为([\s\S]*?),因为这似乎是您的意图
  • 如果你不知道它有什么问题,那你怎么知道它有问题?
  • @Eduardo 我发现它很难阅读,所以我根据您在 cmets / answer中提供的信息进行了扩展

标签: javascript regex syntax


【解决方案1】:

字符串有什么问题

首先,让我们更正字符串中的语法

  • 你需要定义变量tag

    tag = 'tag';
    result = new RegExp( <...>  );
    
  • '("|'|) &lt;...&gt; ' 中有不平衡的引号,需要将其转义为 ("|\'|)

  • 另外,将\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]”)
  • ("|'|)("|'?) 相同
  • 我会使用 [\s\S]*? 而不是 (?:.|\r?\n)*?,就像 @nhahtdh 建议的那样

代码:

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

替代方案: [编辑:来自 cmets 中添加的信息]

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

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

【讨论】:

  • 我想要的方式是以下代码: new RegExp('\['+tag+'(?:=["\']([^\]]+)["\' ])?\]([\\s\\S]*?)\[/'+tag+']', 'gi');
  • 该代码需要正确转义。我假设您现在指定: (a) 您不需要第一组,并且 (b) 标签中的 ='hello' 部分是可选的,但它应该总是有引号。代码:result = new RegExp('\\['+tag+'(?:=(["\'])([^\\]]+)\\1)?\\]([\\s\\S]*?)\\[/'+tag+']','gi');Live example
  • 对我来说最好的是: var re = new RegExp('\['+tag+'(?:=(["\']*)([^\]]+)\ \1)?\]([\\s\\S]*?)\[/'+tag+']', 'gi');
  • 我不明白你为什么要重复 ["\']* 中的引号。检查该表达式的转义。使用 RegExp 构造函数时,每个反斜杠都应为 `\\`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多