通过]分割字符串,[

时间:2014-12-19 06:26:04

标签: javascript split

我有一个如下字符串:

"[a,b,c],[d,e,f],[g,h,i]"

我想知道如何在JavaScript中用],[分隔字符串。 .split("],[")会移除括号。我想保留它们。

预期产出:

["[a,b,c]","[d,e,f]","[g,h,i]"]

修改

这是一个更复杂的案例,我在对@Leo答案的评论中突出显示(其中],[ - 分隔的字符串包含],):

"[dfs[dfs],dfs],[dfs,df,sdfs]]"

预期产出:

["[dfs[dfs],dfs]","[dfs,df,sdfs]]"]

3 个答案:

答案 0 :(得分:5)

试试这个:

"[a,b,c],[d,e,f],[g,h,i]".match(/(\[[^\]]+\])/g)
// ["[a,b,c]", "[d,e,f]", "[g,h,i]"]

编辑对于OP的新案例,这就是诀窍:

"[dfs[dfs],dfs],[dfs,df,sdfs]]".match(/(?!,\[).+?\](?=,\[|$)/g)
// ["[dfs[dfs],dfs]", "[dfs,df,sdfs]]"]

它适用于更复杂的情况:

"[dfs[aa,[a],dfs],[dfs[dfs],dfs],[dfs,df,sdfs]]".match(/(?!,\[).+?\](?=,\[|$)/g)
// ["[dfs[aa,[a],dfs]", "[dfs[dfs],dfs]", "[dfs,df,sdfs]]"]

"[dfs[aa,[a],dfs],[dfs[dfs],dfs],[dfs,df,sdfs]],[dfs,df,sdfs]]".match(/(?!,\[).+?\](?=,\[|$)/g)
// ["[dfs[aa,[a],dfs]", "[dfs[dfs],dfs]", "[dfs,df,sdfs]]", "[dfs,df,sdfs]]"]

以下是我的个人意见

但是,JavaScript的RegExp不支持 lookbehind ?<,这对于此类要求非常方便),使用RegExp可能会成为可维护性的噩梦。在这种情况下,我建议采用一种方法,比如@ alienchow取代分隔符 - 不是那么整洁,而是更易于维护。

答案 1 :(得分:2)

TMTOWDI

我更喜欢用@Leo解释的正则表达式来做这个,但另一种方法是以TMTOWDI&amp;完整性与分割后的map function一致:

&#13;
&#13;
var test = "[a,b,c],[d,e,f],[g,h,i]";
var splitTest = test.split("],[").map(
    function(str) {
        if (str[0] !== '[') {
            str = '[' + str;
        }
        if (str[str.length - 1] !== ']') {
            str += ']';
        }

        return str;
    });

// FORNOW: to see the results
for (var i = 0; i < splitTest.length; i++) {
    alert(splitTest[i]);
}
&#13;
&#13;
&#13;

<强>有感:

如果你的],[ - 分隔字符串中有一对空方括号(例如"[a,b,c],[d,e,f],[],[g,h,i]"),这种方法也会保留它(就像改变@Leo&#39; s一样)正则表达式从/(\[[^\]]+\])/g/(\[[^\]]*\])/g)。

TMTOWDI Redeux

使用][可能在],[ - 分隔字符串中的曲线球(根据您对@Leo的答案的评论),这是我的一个重复最初的方法更健壮:

&#13;
&#13;
var test = "[dfs[dfs],dfs],[dfs,df,sdfs]]";
var splitTest = test.split("],[").map(
    function(str, arrIndex, arr) {
        if (arrIndex !== 0) {
            str = '[' + str;
        }
        if (arrIndex !== arr.length - 1) {
            str += ']';
        }

        return str;
    });

// FORNOW: to see the results
for (var i = 0; i < splitTest.length; i++) {
    alert(splitTest[i]);
}
&#13;
&#13;
&#13;

答案 2 :(得分:2)

我个人

"[dfs[dfs],dfs],[dfs,df,sdfs]]".split("],[");

然后循环到:

  1. 使用"]"附加第一个字符串。
  2. 使用"["前缀最后一个字符串。
  3. 添加"["并在其间添加"]"所有字符串。
  4. 但是,如果你知道你将收到什么样的字符串和字符,并且你真的想要一个单行方法,你可以尝试下面的黑客攻击。

    "],["的所有实例替换为"]unlikely_string_or_special_unicode[",然后按"unlikely_string_or_special_unicode"拆分 - 例如:

    "[dfs[dfs],dfs],[dfs,df,sdfs]]".replace(/\],\[/g,"]~I_have_a_dream~[").split("~I_have_a_dream~");
    

    警告:不是100%全面证明。如果您的输入字符串具有您用作分隔符的不太可能的字符串,那么它会崩溃并且宇宙结束。