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

时间:2012-03-05 03:52:20

标签: javascript jquery regex split

我正在创建一个递归js函数,它基本上解析一个字符串。我不能选择字符串的语法,所以我不能改变它。它由“,”分隔,工作正常,当它们在括号中时,它需要忽略括号内部,在这种情况下它需要在括号后分割。这是一个例子。

String: "h5, h7, (h5, h7, r3)7, h9"

它需要转换为一个看起来像

的字符串数组
array(
"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

显然有更多代码,但这是相关部分。

抱歉如果我把它格式化错了,这是我的第一个问题。

4 个答案:

答案 0 :(得分:1)

如果不是逗号,可以使用.split(',')功能。我想分隔符不应该在字符串中显示未转义,但是如果你无法帮助它,那么你可以使用它:

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

它匹配括号中的任何内容(可以包含非逗号字符)或一组连续的非逗号字符。它只会匹配逗号分隔的内容,而不是逗号本身。

答案 1 :(得分:1)

以下是一些有效的强力方法:

方法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"]

方法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"]

您可以在此处看到这两项工作:http://jsfiddle.net/jfriend00/cs224/

答案 2 :(得分:0)

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

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

(将一对parens与之间的任何内容匹配,或者不包含逗号的内容。)


var re = /\([^)]+\)[^,]*|[^,]+/g;
var items = input_string.match(re);

http://www.regular-expressions.info/javascript.html

答案 3 :(得分:0)

您可以尝试使用特殊|普通排序进行更改,其中您首先尝试匹配棘手的括号子串,否则匹配正常:

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+(字母数字),支持:[^,](非逗号)