List<dynamic> evalList(String text) {
var r = [];
var i = 0;
var isList = false;
void parseStart() {
var m = RegExp(r'^s*[s*').firstMatch(text);
while (m != null) {
// print('start before: ' + text);
if (i != 0) {
r.add([]);
isList = true;
}
i++;
text = text.substring(m.end);
// print('start after: ' + text);
m = RegExp(r'^s*[s*').firstMatch(text);
}
}
void parseEnd() {
var m = RegExp(r'^]s*,?s*').firstMatch(text);
while (m != null) {
// print('end before: ' + text);
if (i > 2) {
var b = r[r.length - 2];
b.add(r.removeLast());
} else {
isList = false;
}
i--;
text = text.substring(m.end);
// print('end after: ' + text);
m = RegExp(r'^]s*,?s*').firstMatch(text);
}
}
while (text.isNotEmpty) {
RegExpMatch m;
// 匹配开头
parseStart();
// 匹配结束
parseEnd();
// 匹配item
m = RegExp(r's*([^[],]*)s*,?').firstMatch(text);
if (m != null) {
var v = m.group(1);
if (v.isNotEmpty) {
if (isList) {
r.last.add(v);
} else {
r.add(v);
}
}
text = text.substring(m.end);
}
}
return r;
}
void main() {
var ar = '''[1,['h', ['w'], 'a'], 'x', [[],[], [],1],2]''';
print(evalList(ar)); // [1, ['h', ['w'], 'a'], 'x', [[], [], [], 1], 2]
}