Регулярное выражение Perl / PCRE, должно работать и в JS (если {} не вложено):
$_ = 'aaa[bbb,ccc[ddd,{eee:1,mmm:999}],nnn[0,3]]
aaa[bbb,ccc[ddd,{eee:1, mmm:[123,555]}],nnn[0,3]]
aaa[bbb, ccc[ddd, ddd],nnn[0,3]]
aaa[bbb,ddd[0,3]]';
@r = /[^][,{}]+|\{[^}]*}/g;
print join ", ", @r;
Выход:
aaa, bbb, ccc, ddd, {eee:1,mmm:999}, nnn, 0, 3,
aaa, bbb, ccc, ddd, {eee:1, mmm:[123,555]}, nnn, 0, 3,
aaa, bbb, ccc, ddd, ddd, nnn, 0, 3,
aaa, bbb, ddd, 0, 3
Грубый перевод на JavaScript:
var input =
"aaa[bbb,ccc[ddd,{eee:1,mmm:999}],nnn[0,3]]\n" +
"aaa[bbb,ccc[ddd,{eee:1, mmm:[123,555]}],nnn[0,3]]\n" +
"aaa[bbb, ccc[ddd, ddd],nnn[0,3]]\n" +
"aaa[bbb,ddd[0,3]]";
var re = /[^][,{}]+|\{[^}]*}/g;
var result = [];
while (!!(match = re.exec(input)))
{
result.push(match[0]);
}
// Using <<value>> rather than just a comma, for clarity around
// whether and how "{...}" was processed or not.
write("<<" + result.join(">><<") + ">>");
Непонятно, что означают разрывы строк во входных данных или результатах в вопросе. Выше они представляют собой разрывы строк во входных данных и затем не обрабатываются специально в результате. Если к ним нужно относиться специально, ОП может редактировать соответствующим образом. Итак, это результат вышеприведенного (опять же, используя <<
и >>
в качестве разделителей, а не ,
для ясности, обрабатывается ли {...}
):
<<aaa>><<bbb>><<ccc>><<ddd>><<{eee:1,mmm:999}>><<nnn>><<0>><<3>><<
aaa>><<bbb>><<ccc>><<ddd>><<{eee:1, mmm:[123,555]}>><<nnn>><<0>><<3>><<
aaa>><<bbb>><< ccc>><<ddd>><< ddd>><<nnn>><<0>><<3>><<
aaa>><<bbb>><<ddd>><<0>><<3>>