【问题标题】:What is the best way to split a string (possible with complicated regex)? (javascript/jquery)拆分字符串的最佳方法是什么(可能使用复杂的正则表达式)? (javascript/jquery)
【发布时间】:2012-03-05 03:52:20
【问题描述】:

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

字符串:“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

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

对不起,如果我格式错误,这是我的第一个问题。

【问题讨论】:

标签: javascript jquery regex 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"]

方法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】:

    如果不是逗号,您可以使用.split(',') 函数。我猜分隔符不应该在字符串中出现未转义,但如果你不能帮助它,那么你可以使用它:

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

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

    【讨论】:

    • split() 真的不适合这个用例。
    • 这个正则表达式工作得很好,谢谢!我也使用 .match 而不是 split。
    【解决方案3】:

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

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

    (匹配一对括号,中间有任何内容,或者不包含逗号。)


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

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

    【讨论】:

    • 哇,真快,谢谢。您是否有机会解释或链接到一个教程,该教程显示您将如何做这样的事情。我基本上是 javascript 正则表达式的新手。我会使用哪个功能?
    • k 谢谢,这让我陷入了一个无限循环,虽然不知何故,也许是一个 for 循环并在字符串的长度处终止它?此外,该正则表达式似乎不起作用。我在这里测试它regextester.com 编辑:它确实有效。我的错,复制粘贴错误。
    • 这得到了支持,但它似乎并没有真正起作用。
    • 当括号末尾有数字时,它不起作用。不过谢谢!我明白了。
    • 啊,是的,没有注意到那个号码藏在那里。还编辑为使用更好的/g 正则表达式。
    【解决方案4】:

    您可以尝试使用 special|normal 排序进行交替,其中您首先尝试匹配棘手的括号子字符串,否则匹配正常:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2023-02-23
      相关资源
      最近更新 更多