Javascript嵌套字符串中的方括号

时间:2015-03-21 18:11:19

标签: javascript regex

我正在寻找一种更容易(而且不那么hacky)的方法来获取字符串中匹配方括号内部的子字符串。例如,假设这是字符串:

[ABC[D][E[FG]]HIJK[LMN]]OPQR[STUVW]XYZ

我想要子字符串:

ABC[D][E[FG]]HIJK[LMN]

现在,我循环遍历字符串并计算打开和关闭的括号,当这些数字相同时,我会获取第一个开括号和最后一个括号的子串。

有没有更简单的方法(即使用正则表达式),所以我需要遍历每个字符?

3 个答案:

答案 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>