13

对于模板引擎,我使用正则表达式来识别字符串中括号内的内容。例如,正则表达式需要匹配 {key} 或 <tag> 或 [element]。

目前我的正则表达式如下所示:

var rx=/([\[\{<])([\s\S]+?)([\]\}>])]/;

问题是这样的正则表达式不会强制括号匹配。例如在以下字符串中:

[{lastName},{firstName}]

正则表达式将匹配[{lastName}

有没有办法定义匹配的括号?例如,如果左括号是 [ 那么右括号必须是 ],而不是 } 或 >

4

4 回答 4

29

最好的方法是拆分成 3 个正则表达式,特别是如果不同的括号可以有不同的含义:

var rx1 = /\[([^\]]+)]/;
var rx2 = /\(([^)]+)\)/;
var rx3 = /{([^}]+)}/;

[]这些将分别匹配由、()和包围的任何文本{}与第一个匹配组中的文本。

于 2012-08-10T18:53:49.907 回答
4

您可以使用|像这样的管道字符 ( ) 的替代方法/\[([\s\S]+?)\]|\{([\s\S]+?)\}|<([\s\S]+?)>/,尽管它会变得很长。

编辑:缩短了正则表达式,不再那么长了......

于 2012-08-10T18:42:56.133 回答
4
var rx = /\[[^\]]+\]|\{[^}]+\}|<[^>]+>/;
于 2013-01-17T00:15:06.390 回答
1

有没有办法定义匹配的括号?例如,如果左括号是 [ 那么右括号必须是 ],而不是 } 或 >

有点。

ERE 没有提供一种方法让您按照您描述的方式将右括号与左括号匹配。(使用 PREG 魔法也许是可能的,但我必须把它留给其他人。)你需要有多个正则表达式,或者一个正则表达式中有多个原子。

如果您使用单个正则表达式,我认为您需要确定您正在检测的括号字符串的类型,以及该字符串的内容。正如评论中提到的,您需要用您的编程语言来执行此操作,但您至少可以从正则表达式中得到您需要的东西。

在下面的正则表达式中,每种样式的字符串都表示为 RE 中的“分支”。分支由 or-bars ( |) 分隔。为清楚起见,我假设所有字符串都是[:alnum:]. 您尚未指定内容,因此您需要根据您的特定要求进行调整。

/(\[)([[:alnum:]]+)\]|(\()([[:alnum:]]+)\)|(\{)([[:alnum:]]+)\}/
 ↑   ↑               ↑                    ↑
 $1  $2           divider              divider

请注意,在每个分支中,第一个字符用圆括号括起来,使其成为“原子”。您需要您的代码像反向引用一样引用这个原子。第二个原子是内弦。现在......我的 JavaScript 不如我的烘焙技能那么强大,但这可能是一个开始:

String.prototype.bracketstyle = function() {
  var re = /(\[)([:alnum:]+)\]|(\()([:alnum:]+)\)|(\{)([:alnum:]+)\}/;
  return this.replace(re,"$1");
}

String.prototype.innerstring = function() {
  var re = /(\[)([:alnum:]+)\]|(\()([:alnum:]+)\)|(\{)([:alnum:]+)\}/;
  return this.replace(re,"$2");
} 

我怀疑你可以将它们组合成一个函数,或者以不同的方式使用它们而不使它们成为一个函数,但你明白了。

于 2012-08-10T18:56:15.627 回答