字符串中的Javascript嵌套方括号
我正在寻找一种更简单(且不太粗糙)的方法来获取字符串中匹配方括号内的子字符串。例如,假设这是字符串:字符串中的Javascript嵌套方括号,javascript,regex,Javascript,Regex,我正在寻找一种更简单(且不太粗糙)的方法来获取字符串中匹配方括号内的子字符串。例如,假设这是字符串: [ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ 我想要子字符串: ABC[D][E[FG]]HIJK[LMN] 现在,我循环遍历字符串,计算开括号和闭括号,当这些数字相同时,我取第一个开括号和最后一个闭括号的子字符串 是否有一种更简单的方法(即使用正则表达式),以便我确实需要循环遍历每个字符?不确定我是否答对了问题(很抱歉) 因此,您的意思是,如果您有一个字符串
[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ
我想要子字符串:
ABC[D][E[FG]]HIJK[LMN]
现在,我循环遍历字符串,计算开括号和闭括号,当这些数字相同时,我取第一个开括号和最后一个闭括号的子字符串
是否有一种更简单的方法(即使用正则表达式),以便我确实需要循环遍历每个字符?不确定我是否答对了问题(很抱歉) 因此,您的意思是,如果您有一个字符串X,您想检查字符串组合Y是否包含在X中 其中Y为
ABC[D][E[FG]]HIJK[LMN]
如果是这样,您可以简单地执行以下操作:
var str=“[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ”;
var res=str.match(/ABC\[D]\[E\[FG]]HIJK\[LMN]/);
然后,上面将返回字符串literalY,因为它匹配str中的内容
请注意符号[用\转义]这一事实非常重要。这是因为在正则表达式中,如果两个方括号之间有任何字母(即[asd]),则正则表达式将匹配指定集中包含的单个字符
您可以在此处测试正则表达式:
我认为问题在于将所有字符从一个开始的方括号放到相应的结束方括号中。平衡组不是用JavaScript实现的,但有一个解决方法:我们可以在这些方括号之间使用几个可选组 以下正则表达式将匹配最多3个嵌套的
[…]
组,您可以添加捕获组以支持更多:
\[[^\]\[]*(?:
\[[^\]\[]*(?:
\[[^\]\[]*(?:\[[^\]\[]*\])*\]
)*[^\]\[]*
\][^\]\[]*
)*[^\]\[]*
\]
请参阅。但是,使用如此重的回溯,性能可能没有那么高
更新
使用:
var str='[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ';
//第一场比赛:
var res=XRegExp.matchRecursive(str,'\\[',']');
document.body.innerHTML=“获取第一个匹配项:
“+JSON.stringify(res,0,4)+”
现在是多个匹配项(在定义XRegExp时添加\“g\”修饰符);
function parse(str) {
return JSON.parse('[' +
str.split('') . join(',') . // insert commas
replace(/\[,/g, '[') . // clean up leading commas
replace(/,]/g, ']') . // clean up trailing commas
replace(/\w/g, '"$&"') // quote strings
+ ']');
}
>> hack('A[B]C')
<< ["A", ["B"], "C"]
//多个匹配项:
res=XRegExp.matchRecursive(str,'\\[',']','g');
document.body.innerHTML+=''+JSON.stringify(res,0,4)+'';
function stringify(array) {
return Array.isArray(array) ? '[' + array.map(stringify).join('') + ']' : array;
}
这是另一种方法,一种难看的方法,它将输入转换为JS数组表示,然后使用JSON解析它。parse
:
stringify(parse("[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ")[0])
现在,您的问题可以通过以下方式解决:
是否还要匹配/捕获
[STUVW]
?@Mathletics不,这是不需要的。您正在解析一种带有嵌套的小语言。对输入中的字符进行迭代并没有什么不好的地方——这就是解析器所做的。不好的地方是一个难以阅读、难以维护、有限的regexp,正如一个答案中所建议的那样。@torazaburo嘿,谢谢,我认为您的正确t、 我只是想让它保持原样。我只是想,如果有一种更简单、更干净的方法使用正则表达式,我可以用它来代替。这是一个数组吗?这应该是什么?啊哈,这么说,为什么不直接使用res='ABC[D][E[FG]]HIJK[LMN'
?