正则表达式匹配括号

时间:2012-08-10 18:30:45

标签: javascript regex

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

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

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

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

[{lastName},{firstName}]

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

有没有办法定义匹配括号?例如,如果开口括号是[那么结束括号必须是],而不是}或者&gt;

4 个答案:

答案 0 :(得分:20)

执行此操作的最佳方法,特别是如果不同的括号可能具有不同的含义,则分为3个正则表达式:

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

这些内容将分别与[](){}所包围的任何文字匹配,文本位于第一个匹配组中。

答案 1 :(得分:4)

你可以使用像[{1}}这样的竖线字符(|)使用替代品,虽然它很长。

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

答案 2 :(得分:3)

var rx = /\[[^\]]+\]|\{[^}]+\}|<[^>]+>/;

答案 3 :(得分:1)

  

有没有办法定义匹配括号?比如说,如果   开口支架是[然后闭合支架必须是],而不是   }或者&gt;

排序-的。

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");
} 

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