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. 2021最新WordPress安装教程(一):Centos7安装Apache

    一转眼2020年已经过去了,看网络上很多WordPress的安装教程都比较旧,有些写的不太详细,WordPress是站长最喜欢的一款建站系统,数据统计到2020年为止,WordPress在所有网站的市 ...

  2. java小技巧

    String 转 Date String classCode = RequestHandler.getString(request, "classCode"); SimpleDat ...

  3. 子网划分、变长子网掩码和TCP/IP排错__散知识点

    1.IP零子网(ip subnet-zero):这个命令可以允许你在自己的网络设计中使用第一个和最后一个子网.例如,C类掩码192通常只可以提供子网64和128,但在使用了ip subnet-zero ...

  4. JD价格监控【docker版】

    快过年了,准备买些年货,于是频繁刷购物网站对比价格,搞得还是挺头大的.我想能不能做个应用抓取实时价格并在低于预期价格后进行提醒,于是就有了本篇文章.本文主要分享怎么将本地项目打包成镜像并推送到dock ...

  5. TypeScript中的private、protected

    首先我们要清楚 private . protected 现阶段只是javascript中的保留字(Reserved words),而非关键字(Keywords ).因此TypeScript中的纯类型声 ...

  6. 2020 ICPC Universidad Nacional de Colombia Programming Contest

    2020 ICPC Universidad Nacional de Colombia Programming Contest A. Approach 三分 显然答案可以三分,注意\(eps\)还有两条 ...

  7. hash应用

    关于HASH ​ 这应该是经常使用的一个算法,因为其预处理后,优秀的\(O(1)\)处理出子串,并且\(O(1)\)比较,大快人心,而且写法简单,令人心情愉悦; ​ 但是其空间复杂度较高,并且有玄学模 ...

  8. codeforces 630K Indivisibility (容斥原理)

    IT City company developing computer games decided to upgrade its way to reward its employees. Now it ...

  9. java的两性

    java具有解释与编译两种特性 本来是昨天的,可以文件丢失了......(我没有偷懒哦,没有!) 所以凭记忆随便写了点 解释就像直接翻译一本书拿给别人看,编译就像找个翻译官一句句翻译给你t听 解释型( ...

  10. service配置文件

    [Unit]Description="itcp Service"After=network.target cs_tcp.service [Service]Type=simpleGu ...