dart 匹配基本数组

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]
}
原文地址:https://www.cnblogs.com/ajanuw/p/12392699.html