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. 后端API接口的错误信息返回规范

    前言 最近我司要制定开发规范.在讨论接口返回的时候,后端的同事询问我们前端,错误信息的返回,前端有什么意见? 所以做了一些调研给到后端的同事做参考. 错误信息返回 在使用API时无可避免地会因为各种情 ...

  2. java8 新特性---列表

  3. charles(2)MAC Charles关闭后无法上网

    前言 charles关闭后,发现网页突然打开了,那大概率是设置了代理,但明明已经关闭了charles,这是由于mac网络偏好设置中,使用的是手动代理,将其改为自动即可 解决方法 1 打开网络偏好设置, ...

  4. 《C++ Primer Plus》啃书计 第1~4章

    <C++ Primer Plus>啃书计 第1~4章 第一章 预备知识 1.1-1.3略过 1.4 程序创建的技巧 1. cfront,它将C++源代码翻译成C源代码,然后再使用标准C编译 ...

  5. hbase Master is initializing

    重装hbase后导致出险问题:hbase(main):007:0> create 'test_t2','f1' ERROR: org.apache.hadoop.hbase.PleaseHold ...

  6. 关于最小生成树 Kruskal 和 Prim 的简述(图论)

    模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...

  7. 功能按钮发post请求 参数放入body中

    1.功能按钮事件参数 queryBody_ids:{data.ids} 前端会生成下划线后面的编码ids,并替换{data.ids} 2.后端建参数model后端参数可以只包含前端返回的部分参数 [D ...

  8. python博客大全

    python技术博客 egon博客 计算机基础系列一:计算机硬件 - linhaifeng - 博客园 https://www.zhihu.com/people/xiaoyuanqujing #ego ...

  9. System.Windows.Forms.Help

    在开发过程中,基本都需要实现帮助功能,而一般帮助功能就是打开一个帮助文档,System.Windows.Forms提供了Help类用于打开帮助文档,挺方便的. Help类提供的方法如下:   Name ...

  10. 如何自己绘制fcitx4输入法皮肤?

    先来给大家看看我自己修改后的结果 当然你可以自己设计,自己定义喜欢的颜色和样式 但是注意,这个教程仅仅针对使用fcitx皮肤面板的输入法,例如rime.sunpinyin等. 搜狗输入法.讯飞输入法. ...