分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

官网地址:http://www.inf.puc-rio.br/~roberto/lpeg/
        LPeg是一个为Lua所使用的新的模式匹配库,基于解析表达式语法(PEGs)。

1.新建“Win32 Console Application”工程,工程名为:lpeg
2.在“Application Settings”中,选择“DLL”和“Empty project”
3.添加下载的“lpeg.h”、“lpeg.c”到工程中
4.菜单栏→“Project”→“Properties”,配置“All Configurations”,"Additional Include Directories"添加"...\Lua\5.1\include","Additional Library Directories"添加"...\Lua\5.1\lib","Additional Dependencies"添加"lua5.1.lib"
5.菜单栏→“Project”→“Add New Item”→“Modele-Definition File(.def)”,名称为:lpeg
6.“lpeg.def”的内容为:

1
2
LIBRARY "lpeg"
EXPORTS luaopen_lpeg

7.编译Release版本
8.测试使用,新建一个lua脚本,内容为:

1
2
3
4
5
6
7
8
local lpeg = require "lpeg"

-- matches a word followed by end-of-string
p = lpeg.R"az"^1 * -1

print(p:match("hello"))        --> 6
print(lpeg.match(p, "hello"))  --> 6
print(p:match("1 hello"))      --> nil

9.运行如下图所示:

Simple Matching 简单匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
local lpeg = require "lpeg"

local match = lpeg.match    -- 对字符串匹配给定的模式
local P = lpeg.P    -- 从字面上匹配一个字符串
local S = lpeg.S    -- 匹配集合中的任何东西
local R = lpeg.R    -- 匹配在一定范围内的任何东西

-- 匹配字符串的开头,成功则返回匹配之后的位置,失败返回nil
print(match(P'a', 'aaa'))   -->2
print(match(P'a', '123'))   -->nil

-- 匹配一个范围之内,匹配一个集合之内
print(match(R'09', '123'))  -->2
print(match(S'123', '123')) -->2

-- 匹配一个以上的项
print(match(P'a'^1, 'aaa')) -->4

-- 符号*组合模式,匹配a之后,再匹配0或多个b
print(match(P'a'*P'b'^0, 'abbc'))   -->4

-- 组合模式,匹配一个或0个a,再匹配b
local maybe_a = P'a'^-1
local match_ab = maybe_a * 'b'
print(match(match_ab, 'ab'))    -->3
print(match(match_ab, 'b'))     -->2
print(match(match_ab, 'aaab'))  -->nil

-- 符号+匹配其中任意一个
local either_ab = (P'a' + P'b')^1
print(either_ab:match'aaa')     -->4
print(either_ab:match'bbaa')    -->5

Basic Captures 基本捕获

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
local lpeg = require "lpeg"

local match = lpeg.match    -- 对字符串匹配给定的模式
local P = lpeg.P    -- 从字面上匹配一个字符串
local S = lpeg.S    -- 匹配集合中的任何东西
local R = lpeg.R    -- 匹配在一定范围内的任何东西

local C = lpeg.C    -- 捕获匹配
local Ct = lpeg.Ct  -- 一个从模式捕获过来的表

-- 捕获数字
local digit = R'09'     -- 任何0到9的数
local digits = digit^1  -- 至少要有一个数字
local cdigits = C(digits)
print(cdigits:match'123')   -->123

-- 包含+-符号
local int = S'+-'^-1 * digits
print(match(C(int), '+23')) -->+23

-- 对捕获的字符串通过一个功能
print(match(int/tonumber, '+123') + 1)  -->124

-- 返回多个捕获,就像string.match
print(match(C(P'a'^1) * C(P'b'^1), 'aabbbb'))   -->aa   bbbb

Building more complicated Patterns 构建更复杂的模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
local lpeg = require "lpeg"

local match = lpeg.match    -- 对字符串匹配给定的模式
local P = lpeg.P    -- 从字面上匹配一个字符串
local S = lpeg.S    -- 匹配集合中的任何东西
local R = lpeg.R    -- 匹配在一定范围内的任何东西

local C = lpeg.C    -- 捕获匹配
local Ct = lpeg.Ct  -- 一个从模式捕获过来的表

-- 考虑一般的浮点数,等同于正则[-+]?[0-9]+\.?[0-9]+([eE][+-]?[0-9]+)?
function maybe(p) return p^-1  end
local digits = R'09'^1
local mpm = maybe(S'+-')
local dot = '.'
local exp = S'eE'
local float = mpm * digits * maybe(dot * digits) * maybe(exp *mpm * digits)
print(match(C(float), '2.3'))   -->2.3
print(match(C(float), '-2'))    -->-2
print(match(C(float), '2e-02')) -->2e-02

-- 从列表识别数字
local listf = C(float) * (',' * C(float))^0
print(listf:match'2,3,4')   -->2    3   4

-- 放进实际的表
print(match(Ct(listf), '1,2,3'))    -->table: 003FAEE0
local tList = match(Ct(listf), '1,2,3')
for i = 1, #tList do
    print(tList[i])
end
-->1
-->2
-->3

-- 转换类型
local floatc = float/tonumber
listf = floatc * (',' * floatc)^0

-- 忽略空格
local sp = P' '^0
function space(pat) return sp * pat * sp end
local floatc = space(float/tonumber)
local listc = floatc * (',' * floatc)^0
print(match(listc, '1,2, 3'))   -->1    2   3

-- 匹配标识符
function list(pat)
    pat = space(pat)
    return pat * (',' * pat)^0
end
local idenchar = R('AZ', 'az') + P'_'
local iden = idenchar * (idenchar + R'09')^0
print(list(C(iden)):match'hello, dolly, _x, s23')   -->hello    dolly   _x  s23

-- 使用语言环境无关定义
local l = {}
lpeg.locale(l)
for k in pairs(l) do print(k) end
--[[
punct
alpha
alnum
digit
graph
xdigit
upper
space
print
cntrl
lower
--]]
iden = (l.alpha + P'_') * (l.alnum + P'_')^0
print(list(C(iden)):match'hello, dolly, _x, s23')   -->hello    dolly   _x  s23

-- 类似的CSV格式
local rlistf = list(float/tonumber)
local csv = Ct((Ct(rlistf) + '\n')^1)
local tcsv = csv:match'1,2.3,3\n10,20, 30\n'
for i = 1, #tcsv do
    for j = 1, #tcsv[i] do
        print(tcsv[i][j])
    end
end
--[[
1
2.3
3
10
20
30
--]]

参考资料:
1.http://www.inf.puc-rio.br/~roberto/lpeg/
2.http://lua-users.org/wiki/LpegTutorial

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

LPeg 0 10的编译与使用相关推荐

  1. 编译安装mariadb-10.0.10

    安装cmake centos上编译mariadb5.5以上的需要至少cmake2.6,如果是rpm包,则需要至少cmake2.8.7以上. [root@school ~]# tar xf cmake- ...

  2. 安卓自定义音量键_红米2|LineageOS17.0|安卓10.0|2.4编译|顶级流畅|超强跑分|全新手势|强力推荐...

    红米2|LineageOS17.0|安卓10.0|2.4编译|顶级流畅|超强跑分|全新手势|强力推荐 第三方ROM不保证无bug下载需谨慎,但是真的是非常好用 ★★刷机需知★★ .务必解锁BL!务必解 ...

  3. 基于Web的Kafka管理器工具之Kafka-manager的编译部署详细安装 (支持kafka0.8、0.9和0.10以后版本)(图文详解)(默认端口或任意自定义端口)...

    不多说,直接上干货! 至于为什么,要写这篇博客以及安装Kafka-manager? 问题详情 无奈于,在kafka里没有一个较好自带的web ui.启动后无法观看,并且不友好.所以,需安装一个第三方的 ...

  4. 【原创】Pig 0.10.0 piggybank 如何编译

    在Pig 0.10.0中 piggybank源程序已经包含在contrib文件夹中,但是没有编译成jar包形式,需要自己用ant编译,官方的参考文档https://cwiki.apache.org/c ...

  5. python 3.10.0源码编译安装

    python 3.10.0源码编译安装 文章目录 python 3.10.0源码编译安装 1. 安装编译依赖工具 2. 下载python 3.10.0 3. 编译安装 Python 4. 体验 1. ...

  6. TensorFlow tfjs 0.10.3 发布

    翻译 | 王柯凝 出品 | AI科技大本营(公众号ID:rgznai100) TensorFlow tfjs 0.10.3 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编译如下. ▌资源 ...

  7. CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)

    文章目录 Redis简介 什么是redis redis的优点 Redis集群都有哪些模式 主从复制(Master-Slave Replication) 哨兵模式(Sentinel) Redis官方 C ...

  8. cmake 编译curl源码_OpenCV4.0 源码编译

    之前写过几篇关于OpenCV的博客,都是基于openCV 3.14写的,10月份OpenCV发布了4.0的bate版本,我就切换到4.0版本上来.之后的博客都会是基于4.0版本的.本文主要介绍一下三个 ...

  9. redis-4.0.10集群安装(3台机器,6个node),以及在Spring项目中的集成,redis操作工具类

    1 Redis安装 redis高可用的三种常见的集群方式:redis sentinel .redis cluster(多主机+分布式).redis sharding.接下来主要介绍redis sent ...

最新文章

  1. 二分查找对应的二叉树的成功和失败ASL
  2. Java code lib aes 加解密
  3. c#.net课程设计:ZCMU通讯录(待更新)
  4. linux中怎么给用户设置不同的权限,linux怎么将一个文件设置为多个人拥有或者同一组内只让某两个用户有删除权限?...
  5. php从网页获得数据,php根据URL获得网页内容
  6. 服务器群集:Windows 2000 和 Windows Server 2003 网络配置的最佳做法(转自Technet)
  7. int、bigint、smallint 和 tinyint范围
  8. 单片机死机了怎么办?
  9. HTC Vive开发笔记之手柄控制
  10. 环境篇-Windows下安装OpenSSL
  11. matlab求两向量夹角_【求精干货】高中数学知识点总结归纳高一学生必须掌握
  12. 体育直播android,500体育直播
  13. 【QImage类常用函数】
  14. 【转载】间谍新高度:间谍组织​Turla利用卫星通信隐藏CC服务器
  15. 智能家居控制模拟套件
  16. talent 远程登录 AAA 认证
  17. 明尼苏达量表结果分析_明尼苏达满意度量表+【长式量表100题】+【稀缺资源】+【免费分享】...
  18. w3cshool之JavaScript对象_Date
  19. 开源多媒体项目汇总与分析
  20. 计算机病毒发展趋势多元化,新型计算机病毒的发展趋势,特征和技术。ppt

热门文章

  1. Hystrix面试 - Hystrix 隔离策略细粒度控制
  2. 60秒验证码倒计时重置
  3. BPDU内容、BPDU中flag位详解、RSTP协议BPDU中的flag位和STP中的BPDU flag位的区别(附图,建议PC观看)
  4. Node.js_1.1
  5. Pipe——高性能IO(二)
  6. 【Day01】你有封装过 axios 吗?主要是封装哪些方面?如何中断 axios 请求?
  7. 【Python】Python库之数据可视化
  8. 注册表操作命令reg
  9. flexbox算法实现_如何使用Flexbox实现水平滚动
  10. 如何为JavaScript选择文本编辑器