Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以最有效的方式提取字符串中包含在复杂括号中的字符_Javascript_Regex_String_Performance - Fatal编程技术网

Javascript 以最有效的方式提取字符串中包含在复杂括号中的字符

Javascript 以最有效的方式提取字符串中包含在复杂括号中的字符,javascript,regex,string,performance,Javascript,Regex,String,Performance,我有一个字符串,其中有括号,括号中可以是另一个括号。例如: var string1 = "1 a (C(b(c+ d)e-fg)) 3# 4df (h j) 5 6 ((k))"; 每个打开的括号都是闭合的,但不一定是立即闭合的,这意味着一个括号内可能有另一个括号。字符、数字和其他符号,如+-#$%(不包括“!”)可以覆盖整个字符串、分组或单独 我想要的是从括号中提取每个字符(不管它是数字、字母、符号……),并格式化那些用一个空格分隔的字符,包括如果有字符一个接一个地出现,如示例中的“c+”或

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

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,' ');
var string1='1a(C(b(C+d)e-fg))3#4df(hj)56((k));
var opens=newarray();
opens.push(string1.indexOf('('));
string1=string1。替换(“(”,“!”)
var closes=新数组();
var done=false;
而(!完成){
openindex=string1.indexOf('(');
closeindex=string1.indexOf(');
string1=string1.替换('),'!')。替换('(','!');
如果(打开索引>关闭索引){
opens.push(openindex);
关闭。推送(关闭索引);
}
if(string1.indexOf('))=-1){
关闭。推送(关闭索引);
完成=正确;
}
}
var string2='';

对于(var i=0;i使用此正则表达式
/[^a-z]*/ig
它将替换除char以外的所有内容

var string1=“12(a(b(cd)efg))34(hj)56((k))”;
string1=string1.匹配(/[a-z]+/ig);
string1=string1.连接(“”);

console.log(string1);
使用正则表达式提取分组字母。使用带有正则表达式的
String.prototype.match()方法作为参数:

var str=“12(a(b(cd)efg))34(hj)56((k))”;
var ex=str.match(/([a-z])+/g);//将给您分组的字母

console.log(例如join(“”);//并用空格将其连接。
如果确保括号处于正确的调整位置,请使用此选项

var string1 = "1 2 (a(b(c d)efg)) 3 4 (h j) 5 6 ((k))";
string1 = string1.replace(/[\(\)]*/ig,'');
alert(string1);

注意:我编辑了replace字符串,因为有一个复制粘贴错误。

我看不到一种简单的方法,只能在一个正则表达式中执行,但这样做可以:

var string1=“1 a(C(b(C+d)e-fg))3#4df(hj)56((k))”;
//在第一个之前移除(
string1=string1.替换(/^[^()]*\(/,'(');
//最后一次之后的休息时间)
string1=string1.替换(/\)[^()]*$/g');
//去掉外括号
string1=string1。替换(/\)[^()]+\(/g')(');
//虽然至少有一个(
while(string1.indexOf(“(”)!=-1){
//删除一对括号
string1=string1。替换(/\([^()]+)\)/g,“$1”);
}
//删除多余的空间
string1=string1.替换(+/g');

console.log(string1);
有一种更短、更好的方法可以在不涉及正则表达式的情况下实现所需的结果:

str='1a(C(b(C+d)e-fg))3#4df(hj)56((k));
数组=[],计数器=0;
str.split(/([()])/).filter(Boolean).forEach(函数(e,i,a){
//增加/减少计数器并将所需值推送到数组
e=='('?计数器++:e==')'?计数器--:计数器>0?数组;
如果(i==a.length-1)
//用空格连接所有值
console.log(array.join(“”));

})
不,字符串是混合的,字符不只是在括号内。正如我在问题中所写的,我只使用数字来更好地显示。在真实场景中,字符和其他符号,如+-$%等,都在字符串上。这将使所有的括号和空格元素化,它返回:abcdefghjk。但他也需要空格。@HenryP而不是否定更好的acc使用
.match()进行ept和提取
method。我不知道这是否很接近。问题是,正如我在问题中所解释的,在实际情况下,字符不仅在括号内,所有类型的字符都在字符串上。我只将数字和字符分开,以便于可视化。太好了,这就是正则表达式解决方案。这比原始代码快吗?这不会太复杂如果字符串是
1A(C(b(C+d)e-fg(测试)))3#4df(HJ)56((k))
感谢您仔细检查以前接受的解决方案!