dart 匹配基本map
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的更多相关文章
- 属性复制方法,当属性名字不一致时候可以传入匹配的Map
/** * @param src * @param dest * @param filedMapping the diffrent fieldName mapping,key is src filen ...
- dart 匹配基本数组
List<dynamic> evalList(String text) { var r = []; var i = 0; var isList = false; void parseSta ...
- Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)
#include <stdio.h> #include <string.h> ][]; ]; ]; int main(){ scanf(]); scanf(]); scanf( ...
- dart入门指南
近来,flutter的热度在上升.flutter应用的主要开发语言是dart, 因此,欲练flutter, 必先了解dart. dart是由google开发的编程语言,可用于开发移动应用,桌面应用,h ...
- hdu 1150 Machine Schedule (经典二分匹配)
//A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...
- EL表达式取Map,List值的总结
EL表达式取Map中的值:后台action 中: Map map = new HashMap(); map.put(key1,value1); map.put(key2,value2); map.pu ...
- Dart编程语言入门
Dart基础入门语法介绍,详细说明可以查看相关视频<Dart编程语言入门>. 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a = 10; 2 ...
- 词典的实现(3)--使用JAVA类库ArrayList实现Map数据结构
1,在词典的实现(2)-借助顺序表(数组)实现词典文章中使用了自定义的数组代替ArrayList,并实现了Map数据结构的基本功能.而借助JAVA类库ArrayList类的一些方法可以更加容易地实现M ...
- Dart基础学习02--变量及内置类型
Dart基础学习02--变量及内置类型 Dart中的变量 首先看一个变量的定义和赋值 var name = 'Bob'; 在Dart中变量名都是引用,这里的name就是一个指向值为Bob的字符串的引用 ...
随机推荐
- vue开发中的"骚操作"
前言 在与同事协作开发的过程中,见识到了不少"骚操作".因为之前都没用过,所以我愿称之为"高级技巧"! Vue.extend 在交互过程中,有个需求就是点击图标 ...
- java架构《Socket网络编程基础篇》
本章主要介绍Socket的基本概念,传统的同步阻塞式I/O编程,伪异步IO实现,学习NIO的同步非阻塞编程和NIO2.0(AIO)异步非阻塞编程. 目前为止,Java共支持3种网络编程模型:BIO.N ...
- Spring5源码,@ModelAttribute
一.什么是@ModelAttribute注解 二.@ModelAttribute注解相关代码详解 一.什么是@ModelAttribute注解 @ModelAttribute注解主要用来将请求转换为使 ...
- Spark练习之Transformation操作开发
Spark练习之Transformation操作开发 一.map:将集合中的每个元素乘以2 1.1 Java 1.2 Scala 二.filter:过滤出集合中的偶数 2.1 Java 2.2 Sca ...
- 网络编程(socket简介)
socket简介 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中 ...
- 自己动手实现java断点/单步调试(二)
自从上一篇<自己动手实现java断点/单步调试(一)> 是时候应该总结一下JDI的事件了 事件类型 描述 ClassPrepareEvent 装载某个指定的类所引发的事件 ClassUnl ...
- docker部署 springboot 多模块项目+vue
之前学习了docker,今天就来试试将这个项目打包成docker镜像并通过运行一个镜像来运行项目.这里使用的项目是el-admin.是一个开源的springboot后端管理框架(前端vue),有兴趣的 ...
- 从微信小程序到鸿蒙js开发【05】——tabs组件&每日新闻
目录: 1.tabs, tab-bar, tab-content 2.tabs的事件处理 3.tabs实现的每日新闻 1.tabs, tab-bar, tab-content 上章说到,鸿蒙的list ...
- hdu 4738 Caocao's Bridges(割边)
题目链接 用tarjan求桥上的最小权值 #include<bits/stdc++.h> #define ll long long int using namespace std; inl ...
- 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}
P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...