我有一个如下字符串:
"[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]]"]
答案 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)
我更喜欢用@Leo解释的正则表达式来做这个,但另一种方法是以TMTOWDI&amp;完整性与分割后的map
function一致:
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;
<强>有感:强>
如果你的],[
- 分隔字符串中有一对空方括号(例如"[a,b,c],[d,e,f],[],[g,h,i]"
),这种方法也会保留它(就像改变@Leo&#39; s一样)正则表达式从/(\[[^\]]+\])/g
到/(\[[^\]]*\])/g
)。
使用]
和[
可能在],[
- 分隔字符串中的曲线球(根据您对@Leo的答案的评论),这是我的一个重复最初的方法更健壮:
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;
答案 2 :(得分:2)
我个人
"[dfs[dfs],dfs],[dfs,df,sdfs]]".split("],[");
然后循环到:
"]"
附加第一个字符串。"["
前缀最后一个字符串。"["
并在其间添加"]"
所有字符串。但是,如果你知道你将收到什么样的字符串和字符,并且你真的想要一个单行方法,你可以尝试下面的黑客攻击。
将"],["
的所有实例替换为"]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%全面证明。如果您的输入字符串具有您用作分隔符的不太可能的字符串,那么它会崩溃并且宇宙结束。