var map_start = RegExp(r'^\s*\{\s*');
var map_end = RegExp(r'^\}\s*(,)?\s*'); var hasComma = true;
Map evalMap(String text, [Function endCB]) {
var r = {};
String k; void parseStart() {
var m = map_start.firstMatch(text);
while (m != null) {
text = text.substring(m.end);
m = map_start.firstMatch(text);
}
} void parseEnd() {
var m = map_end.firstMatch(text); if (m == null && !hasComma) {
throw '逗号匹配错误。';
} while (m != null) {
hasComma = m.group(1) != null;
text = text.substring(m.end);
if (endCB != null) {
endCB({
'map': r,
'text': text,
});
text = '';
}
m = map_end.firstMatch(text);
}
} // 匹配开头
parseStart();
while (text.isNotEmpty) {
// 匹配结束
parseEnd(); var m_k = RegExp(r'([^]+?)\s*:\s*').firstMatch(text);
if (m_k != null) {
k = m_k.group(1);
text = text.substring(m_k.end);
} else {
k = null;
} // 匹配value前,先查看是否为{}
if (map_start.hasMatch(text)) {
evalMap(text, (_r) {
r[k.trim()] = _r['map'];
text = _r['text'];
});
} else {
var m_v = RegExp(
r'''((?:true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?|"[^"\\\n\r]*"|'[^'\\\n\r]*')+)\s*(,)?\s*''')
.firstMatch(text);
if (m_v != null && k != null) {
var v = m_v.group(1);
hasComma = m_v.group(2) != null;
r[k.trim()] = v.trim();
k = null;
text = text.substring(m_v.end);
}
}
}
return r;
} void main() {
var text = ''' {
k: 'v',
k2: {},
k3: {name: 'a', x: {a: 1}}
} ''';
var map = evalMap(text);
print(map);
print(map['k3']);
print(map['k3']['x']);
print(map['k3']['x']['a']);
}
λ dart bin/main.dart
{k: 'v', k2: {}, k3: {name: 'a', x: {a: 1}}}
{name: 'a', x: {a: 1}}
{a: 1}
1

dart 匹配基本map的更多相关文章

  1. 属性复制方法,当属性名字不一致时候可以传入匹配的Map

    /** * @param src * @param dest * @param filedMapping the diffrent fieldName mapping,key is src filen ...

  2. dart 匹配基本数组

    List<dynamic> evalList(String text) { var r = []; var i = 0; var isList = false; void parseSta ...

  3. Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)

    #include <stdio.h> #include <string.h> ][]; ]; ]; int main(){ scanf(]); scanf(]); scanf( ...

  4. dart入门指南

    近来,flutter的热度在上升.flutter应用的主要开发语言是dart, 因此,欲练flutter, 必先了解dart. dart是由google开发的编程语言,可用于开发移动应用,桌面应用,h ...

  5. hdu 1150 Machine Schedule (经典二分匹配)

    //A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...

  6. EL表达式取Map,List值的总结

    EL表达式取Map中的值:后台action 中: Map map = new HashMap(); map.put(key1,value1); map.put(key2,value2); map.pu ...

  7. Dart编程语言入门

    Dart基础入门语法介绍,详细说明可以查看相关视频<Dart编程语言入门>. 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a = 10; 2 ...

  8. 词典的实现(3)--使用JAVA类库ArrayList实现Map数据结构

    1,在词典的实现(2)-借助顺序表(数组)实现词典文章中使用了自定义的数组代替ArrayList,并实现了Map数据结构的基本功能.而借助JAVA类库ArrayList类的一些方法可以更加容易地实现M ...

  9. Dart基础学习02--变量及内置类型

    Dart基础学习02--变量及内置类型 Dart中的变量 首先看一个变量的定义和赋值 var name = 'Bob'; 在Dart中变量名都是引用,这里的name就是一个指向值为Bob的字符串的引用 ...

随机推荐

  1. vue开发中的"骚操作"

    前言 在与同事协作开发的过程中,见识到了不少"骚操作".因为之前都没用过,所以我愿称之为"高级技巧"! Vue.extend 在交互过程中,有个需求就是点击图标 ...

  2. java架构《Socket网络编程基础篇》

    本章主要介绍Socket的基本概念,传统的同步阻塞式I/O编程,伪异步IO实现,学习NIO的同步非阻塞编程和NIO2.0(AIO)异步非阻塞编程. 目前为止,Java共支持3种网络编程模型:BIO.N ...

  3. Spring5源码,@ModelAttribute

    一.什么是@ModelAttribute注解 二.@ModelAttribute注解相关代码详解 一.什么是@ModelAttribute注解 @ModelAttribute注解主要用来将请求转换为使 ...

  4. Spark练习之Transformation操作开发

    Spark练习之Transformation操作开发 一.map:将集合中的每个元素乘以2 1.1 Java 1.2 Scala 二.filter:过滤出集合中的偶数 2.1 Java 2.2 Sca ...

  5. 网络编程(socket简介)

    socket简介 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中 ...

  6. 自己动手实现java断点/单步调试(二)

    自从上一篇<自己动手实现java断点/单步调试(一)> 是时候应该总结一下JDI的事件了 事件类型 描述 ClassPrepareEvent 装载某个指定的类所引发的事件 ClassUnl ...

  7. docker部署 springboot 多模块项目+vue

    之前学习了docker,今天就来试试将这个项目打包成docker镜像并通过运行一个镜像来运行项目.这里使用的项目是el-admin.是一个开源的springboot后端管理框架(前端vue),有兴趣的 ...

  8. 从微信小程序到鸿蒙js开发【05】——tabs组件&每日新闻

    目录: 1.tabs, tab-bar, tab-content 2.tabs的事件处理 3.tabs实现的每日新闻 1.tabs, tab-bar, tab-content 上章说到,鸿蒙的list ...

  9. hdu 4738 Caocao's Bridges(割边)

    题目链接 用tarjan求桥上的最小权值 #include<bits/stdc++.h> #define ll long long int using namespace std; inl ...

  10. 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}

    P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...