我正在寻找一种更容易(而且不那么hacky)的方法来获取字符串中匹配方括号内部的子字符串。例如,假设这是字符串:
[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ
我想要子字符串:
ABC[D][E[FG]]HIJK[LMN]
现在,我循环遍历字符串并计算打开和关闭的括号,当这些数字相同时,我会获取第一个开括号和最后一个括号的子串。
有没有更简单的方法(即使用正则表达式),所以我需要遍历每个字符?
答案 0 :(得分:1)
这是另一种方法,一种丑陋的黑客攻击将输入转换为JS数组表示,然后使用JSON.parse
解析它:
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"]
现在是一个将数组转回括号内的字符串:
function stringify(array) {
return Array.isArray(array) ? '[' + array.map(stringify).join('') + ']' : array;
}
现在您的问题可以通过以下方式解决:
stringify(parse("[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ")[0])
答案 1 :(得分:0)
不确定我的问题是否正确(对不起)。
所以你的意思是,如果你有一串字符 X ,你想检查字符串组合 Y 是否包含在 X < / STRONG>?
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]/);
然后上面会返回字符串文字 Y ,因为它匹配str里面的内容。
重要的是要注意符号[正在用\来转义。这是因为在正则表达式中,如果你有两个方括号,其间有任何字母(即。[asd]),那么正则表达式将匹配指定集合中包含的单个字符。
你可以在这里测试正则表达式: https://regex101.com/r/zK3vZ3/1
答案 2 :(得分:0)
我认为问题是将所有字符从一个开头的方括号到对应的结束方括号。 平衡组未在JavaScript中实现,但有一种解决方法:我们可以在这些方括号之间使用几个可选组。
以下正则表达式最多可匹配3个嵌套[...]
组,您可以添加捕获组以支持更多:
\[[^\]\[]*(?:
\[[^\]\[]*(?:
\[[^\]\[]*(?:\[[^\]\[]*\])*\]
)*[^\]\[]*
\][^\]\[]*
)*[^\]\[]*
\]
见example here。然而,如此沉重的回溯,表现可能并不高。
更新
使用XRegExp
:
var str = '[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ';
// First match:
var res = XRegExp.matchRecursive(str, '\\[', ']');
document.body.innerHTML = "Getting the first match:<br/><pre>" + JSON.stringify(res, 0, 4) + "</pre><br/>And now, multiple matches (add \"g\" modifier when defining the XRegExp)";
// Multiple matches:
res = XRegExp.matchRecursive(str, '\\[', ']', 'g');
document.body.innerHTML += "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/2.0.0/xregexp-all-min.js"></script>