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. Java多线程--两种实现方式

    进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...

  2. 圣诞快乐!OIer挂分小技巧

    OIer常犯错误 自己的错误 循环里套return 线段树求和 int 定义,下传 int 定义 cmp<,>号分不清 主观行为举动错误 踢电源线,注意安全(_Destiny) TLE 大 ...

  3. Poem 01(转)

    Dear Sunshine The way you glow through my blinds in the morning. It makes me feel like you missed me ...

  4. 2020第十一届蓝桥杯第二场JavaB组

    第一题:门牌制作(624) 题目大意: 判断1到2020里面共有多少个'2': 解析: 本题简而言之就是找'2'这一个数 第一种方法:遍历将其转换为字符然后再遍历寻找 第二种方法:直接用数值的方法进行 ...

  5. 小白搭建WAMP详细教程---apache、mysql、php的整合配置

    Apache与PHP整合 我们之前说过PHP能够解析PHP代码, 可是不服务于apache,apache能够获取接收浏览器的请求, 可是不能处理PHP代码, 要实现动态站点开发,就必须结合apache ...

  6. HashMap 和 Hashtable两者的区别以和解释

    HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...

  7. kafka的演进历史

    首先如果我开始做一个消息队列,最开始的时候可能就是一台单机上的一个单一的log日志,不断地向这个日志中追加消息即可. 后来,可能由于一个log日志支撑不了太多的读写请求,于是就对这个log日志进行了拆 ...

  8. Flink-v1.12官方网站翻译-P023-The Broadcast State Pattern

    广播状态模式 在本节中,您将了解如何在实践中使用广播状态.请参考状态流处理,了解状态流处理背后的概念. 提供的API 为了展示所提供的API,我们将在介绍它们的全部功能之前先举一个例子.作为我们的运行 ...

  9. jRating五星评级

    <!DOCTYPE html> <html> <head> <title>jrating使用示例</title> <meta char ...

  10. Educational Codeforces Round 91 (Rated for Div. 2) A. Three Indices

    题目链接:https://codeforces.com/contest/1380/problem/A 题意 给出一个大小为 $n$ 的排列,找出是否有三个元素满足 $p_i < p_j\ and ...