Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.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/jquery)_Javascript_Jquery_Regex_Split - Fatal编程技术网

拆分字符串的最佳方法是什么(对于复杂的正则表达式可能)?(javascript/jquery)

拆分字符串的最佳方法是什么(对于复杂的正则表达式可能)?(javascript/jquery),javascript,jquery,regex,split,Javascript,Jquery,Regex,Split,我正在创建一个递归js函数,它基本上解析字符串。我不能选择字符串的语法,所以我不能更改它。它由“,”分隔,这很好,当它们在括号内时除外,它需要忽略括号内的内容,在这种情况下,它需要在括号后拆分。这里有一个例子 String: "h5, h7, (h5, h7, r3)7, h9" 字符串:“h5,h7,(h5,h7,r3)7,h9” 它需要转换成一个字符串数组 array( "h5", "h7", "(h5, h7, r3)7", "h9" ); 排列( “h5”, “h7”, “(h5、h7

我正在创建一个递归js函数,它基本上解析字符串。我不能选择字符串的语法,所以我不能更改它。它由“,”分隔,这很好,当它们在括号内时除外,它需要忽略括号内的内容,在这种情况下,它需要在括号后拆分。这里有一个例子

String: "h5, h7, (h5, h7, r3)7, h9" 字符串:“h5,h7,(h5,h7,r3)7,h9” 它需要转换成一个字符串数组

array( "h5", "h7", "(h5, h7, r3)7", "h9" ); 排列( “h5”, “h7”, “(h5、h7、r3)7”, “h9” ); 我知道可能有一种方法可以用正则表达式来实现,我有一个非常基本的正则表达式知识,但我无法理解。如果有用的话,这里是我的js代码

cols = pattern.split(',');// This is where the regex would go.
                $.each(cols, function(index, val){
                val = $.trim(val);
                    var type = "";
                    var ctr = 0;
                    for(ctr = 0; ctr < val.length && isAlpha(val[ctr]); ctr++)
                        type += val[ctr];
                    if(val[0] == "("){
                        open = 1;
                        substr = "";
                        i = 1;
                        for(; i < val.length && open > 0; i++ ){
                            if(val[i] == ")"){
                                open--;
                            }
                            else
                                substr += val[i];
                        }
                    var repeater = val.substr(i);
                    if(isNumeric(repeater)){
                        for(j=0; j < repeater; j++){
                          colLen += updateRow(row, substr, false);
                        }
                    }
                    else{
                        $('#'+row).append('<a href="" >SE</a>');
                        colLen++;
                    }
                }
               // If it doesn't start with a parenthesis, do print it as usual
cols=pattern.split(',');//这就是正则表达式要去的地方。
$.each(cols,函数(索引,val){
val=$.trim(val);
var type=“”;
var-ctr=0;
对于(ctr=0;ctr0;i++){
如果(val[i]==”){
开放--;
}
其他的
substr+=val[i];
}
var中继器=val.substr(i);
if(数字(中继器)){
对于(j=0;j
显然还有很多代码,但这是相关的部分


很抱歉,如果格式设置错误,这是我的第一个问题。

诀窍是,您不想使用
split()
来执行此操作-相反,您只想多次匹配正则表达式。类似于以下正则表达式的操作可以:

/\([^)]+\)|[^,]+/
(将一对括号与中间的任何内容匹配,或将不包含逗号的内容匹配。)



如果不是逗号,您可以使用
.split(',')
函数。我想分隔符不应该出现在字符串中,但如果您无法控制,则可以使用以下方法:

[^,]*\([^\)]*\)[^,]*|[^,]+

它匹配括号中的任何内容(括号周围可以有非逗号字符)或一组连续的非逗号字符。它将只匹配由逗号分隔的内容,而不匹配逗号本身。

以下是一些蛮力方法:

方法1:匹配括号内的部分,并用其他内容临时替换其中的逗号,这样您就可以使用逗号拆分,然后将逗号放回括号内

var data = "h5, h7, (h5, h7, r3)7, h9";

var temp = data.replace(/\([^)]+\)/, function(match) {
    return(match.replace(/,/g, "xx!xx"));
});

var splitData = temp.split(/\s*,\s*/);
for (var i = 0; i < splitData.length; i++) {
    splitData[i] = splitData[i].replace(/xx!xx/g, ",");
}

// splitData = ["h5", "h7", "(h5, h7, r3)7", "h9"]
var data=“h5,h7,(h5,h7,r3)7,h9”;
var temp=data.replace(/\([^)]+\)/,函数(匹配){
返回(匹配.替换(/,/g,“xx!xx”));
});
var splitData=temp.split(/\s*,\s*/);
对于(变量i=0;i
方法2:用逗号分割整个字符串,然后将括号内的部分重新放在一起:

var data = "h5, h7, (h5, h7, r3)7, h9";

var splitData = data.split(",");
var output = [], pieces, inParen = false;
for (var i = 0; i < splitData.length; i++) {
    temp = splitData[i];
    if (inParen) {
        pieces += "," + temp;
        if (temp.indexOf(")") != -1) {
            inParen = false;
            output.push(pieces);
        }
    } else {
        temp = $.trim(temp);
        if (temp.indexOf("(") != -1) {
            pieces = temp;
            inParen = true;
        } else {
            output.push(temp);
        }
    }
}

// output = ["h5", "h7", "(h5, h7, r3)7", "h9"]
var data=“h5,h7,(h5,h7,r3)7,h9”;
var splitData=data.split(“,”);
var输出=[],片段,inParen=false;
对于(变量i=0;i

您可以在这里看到这两项工作:

您可以尝试使用特殊的|正常顺序进行交替,其中您首先尝试匹配复杂的插入子字符串,否则将匹配正常:

var data = "h5, h7, 9(h5, h7, r3)7, h9";
var myregexp = /([^,]*?\([^)]*\)[^,]*|[^,]+)/g;
var match = myregexp.exec(data);
var result = "spans found:\n";
while (match != null) {
    result += "match:" + RegExp.$1 + '\n';
    match = myregexp.exec(data);
}
alert(result);

编辑:去掉
\w+
(字母数字)支持:
[^,]
(非逗号)

如果你想练习正则表达式,我建议你选择:)哇,太快了,谢谢。你有没有可能解释或链接到一个教程,展示你将如何做这样的事情。我基本上是javascript正则表达式的新手。我会使用哪个函数?谢谢,这让我陷入了一个无休止的循环,虽然不知怎的,可能是一个for循环,并在字符串长度处终止它?而且,正则表达式没有似乎有效。我在这里测试它编辑:它有效。我的错误,复制粘贴错误。这是获得投票,但它似乎不起作用。当括号末尾有一个数字时,它不起作用。不过谢谢!我得到了。啊,是的,我没有注意到那个数字隐藏在那里。还进行了编辑以使用更好的
/g
regex、
split()。
var data = "h5, h7, 9(h5, h7, r3)7, h9";
var myregexp = /([^,]*?\([^)]*\)[^,]*|[^,]+)/g;
var match = myregexp.exec(data);
var result = "spans found:\n";
while (match != null) {
    result += "match:" + RegExp.$1 + '\n';
    match = myregexp.exec(data);
}
alert(result);