Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匹配方括号的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 匹配方括号的正则表达式

Javascript 匹配方括号的正则表达式,javascript,regex,Javascript,Regex,对于模板引擎,我使用正则表达式来标识字符串中括号下的内容。例如,正则表达式需要匹配{key}或[element] 当前我的正则表达式如下所示: var rx=/([\[\{<])([\s\S]+?)([\]\}>])]/; 正则表达式将匹配[{lastName} 有没有办法定义匹配的括号?比如说,如果开始括号是a[那么结束括号必须是a],而不是a}或a>,你可以使用管道字符()来替代它,比如这个/\[([\s\s]+?)\]\{([\s\s]+?)\}/,尽管它会很长 编辑:缩短正

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

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

var rx=/([\[\{<])([\s\S]+?)([\]\}>])]/;
正则表达式将匹配
[{lastName}


有没有办法定义匹配的括号?比如说,如果开始括号是a[那么结束括号必须是a],而不是a}或a>

,你可以使用管道字符(
)来替代它,比如这个
/\[([\s\s]+?)\]\{([\s\s]+?)\}/
,尽管它会很长


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

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

var rx1 = /\[([^\]]+)]/;
var rx2 = /\(([^)]+)\)/;
var rx3 = /{([^}]+)}/;
它们将分别将
[]
()
{}
包围的任何文本与第一个匹配组中的文本进行匹配

有没有办法定义匹配的括号?比如说 开始括号是a[然后结束括号必须是a],而不是a }或a>

有点

ERE没有为您提供一种方法,可以按照您描述的方式将结束括号与开始括号进行匹配。(可能可以使用PREG magic,但我必须将其留给其他人。)您需要在一个正则表达式中包含多个正则表达式或多个原子

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

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

/(\[)([[:alnum:]]+)\]|(\()([[:alnum:]]+)\)|(\{)([[:alnum:]]+)\}/
 ↑   ↑               ↑                    ↑
 $1  $2           divider              divider
请注意,在每个分支中,第一个字符用圆括号括起来,使其成为“atom”。您需要代码像反向引用一样引用此atom。第二个atom是内部字符串。现在……我的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");
} 
我想你可以把它们组合成一个函数,或者在不把它们变成函数的情况下以不同的方式使用它们,但是你明白了;
var rx = /\[[^\]]+\]|\{[^}]+\}|<[^>]+>/;

请记住,方括号表达式中的字符通常会失去其特殊性。因此,
[[]
匹配左方括号,
[{]
匹配左花括号等。听起来你需要的是解析器,而不是正则表达式。所有这些括号的意思是一样的吗?如果不是,你只是想要不同的regexes@ghoti正确,我只是认为它更易于阅读。这是一个很好的例子,但足以说明,不,您不能这样做。而不是
([\s\s]+?)
您可以使用类似于
([^\]]+)
,这样可以更清楚地表明您正在匹配不包含结尾括号(以及更短的)的最长字符序列。这看起来与第一个答案类似。但我恐怕JavaScript不明白:alnum:
[:alnum:
只是
的一条捷径[A-Za-z0-9]
。这不是什么捷径;-)没错,它可以用几种语言工作,但不能用JavaScript。我想说的是,如果
[[:alnum:][]+
对您不起作用,只需将其替换为
[A-Za-z0-9]+
(将此标记为答案,因为它是注释中的第一个答案)对,这与第一个答案类似。我实际上对使用您在另一篇博文中展示的对象感兴趣:{“[”:“]”,“”,…}。for…in循环中使用的对象可能有助于使模式更通用。@Christophe。您接受的答案质量很差。您必须检查三个正则表达式的匹配项并将它们进行比较:例如,第一个正则表达式将与“{[abc]}”匹配这不是您想要的,等等。此外,答案根本不处理
,而是处理
()
不必要。你不必仅仅因为第一个答案正确了一半就接受它——而你接受的答案甚至不是这样!嗯,当时听起来是个好主意……我实际上认为我发布的解决方案可能也很适合这里。
var rx = /\[[^\]]+\]|\{[^}]+\}|<[^>]+>/;