javascript - 以最有效的方式提取字符串中复杂括号内的字符

标签 javascript regex string performance

我有一个字符串,其中有括号,括号中可以是另一个括号。例如:

var string1 = "1 a (C(b(c+ d)e-fg)) 3# 4df (h j) 5 6 ((k))";

每个开括号都是闭合的,但不一定立即闭合,这意味着一个括号内可能有另一个括号。字符、数字和其他符号,如 + - # $ %(不包括“!”)可以遍布整个字符串,可以分组或单独出现。

我想要的是从括号中提取每个字符(无论它是数字、字母、符号...),并格式化这些字符,并用一个空格分隔,包括是否存在紧接着一个接着一个的字符,例如“c+”或“e-fg”,它们将被分组在一起。在上面的例子中,结果将是:

var string2 = "C b c+ d e-fg h j k";

我有这样的代码:

var string1 = '1 a (C(b(c+ d)e-fg)) 3# 4df (h j) 5 6 ((k))';
var opens = new Array();
opens.push(string1.indexOf('('));
string1 = string1.replace('(','!')
var closes = new Array();
var done = false;
while (!done) {
    openindex = string1.indexOf('(');
    closeindex = string1.indexOf(')');
    string1 = string1.replace(')','!').replace('(','!');
    if (openindex>closeindex) {
        opens.push(openindex);
        closes.push(closeindex);
    }
    if (string1.indexOf(')')==-1) {
        closes.push(closeindex);
        done = true;
    }
}
var string2 = '';
for (var i=0;i<opens.length;i++) string2 = string2 + string1.substring(opens[i],closes[i]);
string2 = string2.replace(/!!/g,'  ').replace(/!/g,' ').replace(/  /g,' ');

这有效( https://jsfiddle.net/nL2gp80j/1/ ),但我正在寻找更有效的解决方案。我不懂正则表达式,也许用它可以更好更快地完成这个任务。

最佳答案

有一种更短、更好的方法来实现所需的结果,而无需更多地涉及正则表达式:

str = '1 a (C(b(c+ d)e-fg)) 3# 4df (h j) 5 6 ((k))';
array = [], counter = 0;

str.split(/([()])/).filter(Boolean).forEach(function(e, i, a) {
    // Increase / decrease counter and push desired values to an array
    e == '(' ? counter++ : e == ')' ? counter-- : counter > 0 ? array.push(e) : true;
    if (i === a.length - 1)
    	// Join all values with a whitespace between
	console.log(array.join(' '));
});

关于javascript - 以最有效的方式提取字符串中复杂括号内的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42643306/

相关文章:

javascript - Telerik RadGrid 滚动条正在偏移列

java - 在一大串随机字符中找到一串随机字符(可能有错误)

c# - 使用正则表达式识别字符序列并用它构建字符串

string - "?\s"在 Elixir 中意味着什么?

javascript - 如何在图像区域映射中分配 HTML onmouseover 事件处理程序?

javascript - 使用 jquery ajax 与 native xhr

javascript - 如何打印 html 代码以便我只写一次?

java - 如何在 java 中将 [10] 替换为 {ref10}

c - C语言中如何计算字符串数组元素的个数?

regex - vba正则表达式最后一次出现