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