• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > 深入探究Lua中的解析表达式

深入探究Lua中的解析表达式

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了lua 正则表达式,lua文件解密,lua,lua语言,lua教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

 使用一个模式

这个例子显示了一个建立和使用模式的程序,它非常简单但很完整:

-- 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</div>

模式是简单的一个或多个小写字符并在尾端以(-1)结束的序列。该程序调用match来当作一个方法和函数。在以上成功案例,匹配函数返回成功 匹配的第一个字符的索引,为其字符串长度加1。

这个例子解析一个名称 - 值配对的列表,并返回那些配对的表:

local space = lpeg.space^0
local name = lpeg.C(lpeg.alpha^1) * space
local sep = lpeg.S(",;") * space
local pair = lpeg.Cg(name * "=" * space * name) * sep^-1
local list = lpeg.Cf(lpeg.Ct("") * pair^0, rawset)
t = list:match("a=b, c = hi; next = pi")  --> { a = "b", c = "hi", next = "pi" }</div>

每一配对都有  formatname =namefollowed 的一个可选的分离器(用逗号或分号)。  配对模式(Thepairpattern)在一个组模式里形成闭包,那么那些名称就可以成为单个捕获的值。 列表模式 (Thelistpattern)然后折叠这些捕获。 它以空列表开始,通过创建列表捕获匹配一个空字符串,然后为每个捕获(一名称对)appliesrawsetover累加器(表)和捕捉值(对名称)。rawsetreturns((未初始化的集合)返回表本身,所以累加器总是表中执行。


以下代码创建了一个模式,该模式使用给定的分隔模式sep作为分隔器来来拆分字符串:

  sep = lpeg.P(sep)
  local elem = lpeg.C((1 - sep)^0)
  local p = elem * (sep * elem)^0
  return lpeg.match(p, s)
end</div>

首先,该函数确保sep一个合适的模式。只要没有匹配分隔器,该模式的elem 是重复的零个或多个任意字符。它还捕捉其匹配值。模式p匹配由sep拆分的一组元素.

如果拆分产生的结果值太多,可能会溢出由一个Lua函数返回的最大数目的值。在这种情况下,我们可以将这些值放到一个表中:

  sep = lpeg.P(sep)
  local elem = lpeg.C((1 - sep)^0)
  local p = lpeg.Ct(elem * (sep * elem)^0)   -- make a table capture
  return lpeg.match(p, s)
end</div>

模式搜索

基本的匹配仅仅工作在锚定模式下。如果我们打算查找匹配字符串中任何地方的模式,那么我们必须写一个匹配任何地方的模式。

因为模式是可以编写的,所以我们可以编写一个函数,它给定一个任意的模式p,返回一个搜索p的新模式,以匹配字符串的任何位置。执行这种搜索有几种方法。一种方法如下:

  return lpeg.P{ p + 1 * lpeg.V(1) }
end</div>

这个语法的直接解读:匹配p或者跳过一个字符,然后试图再次匹配。

如果我们想知道这个模式在字符串的所有匹配位置(而不仅仅知道它在字符串的某个位置),那么我们可以给这个模式添加位置捕捉:

function anywhere (p)
  return lpeg.P{ I * p * I + 1 * lpeg.V(1) }
end</div>

print(anywhere("world"):match("hello world!"))   -> 7   12

这种搜索的另一个方法如下:

function anywhere (p)
  return (1 - lpeg.P(p))^0 * I * p * I
end</div>

再次说明,这个模式的直接解读:当不匹配p时,它跳过尽可能多的字符,然后对p进行匹配(外加正确的位置捕捉)。

如果我们打算查找仅仅匹配单词边界的模式的话,那么我们可以使用以下转换:

function atwordboundary (p)
  return lpeg.P{
    [1] = p + t.alpha^0 * (1 - t.alpha)^1 * lpeg.V(1)
  }
end</div>

平衡的括号

以下模式只匹配带有平衡括号的字符串::

阅读第一个(也是唯一的)所给语法规则,所谓平衡字符串,就是一个开括号,后跟零个或多个非括号字符或者平衡字符串(LPFG.V(1)),最后跟着与开括号能够闭合的结束括号。
全局替换

下面的例子和tostring.gsub所做工作类似。它接收一个母串和一个模式以及一个替换值,然后替代所传入的母串中所有与指定模式匹配的子串为指定的替换值::

  patt = lpeg.P(patt)
  patt = lpeg.Cs((patt / repl + 1)^0)
  return lpeg.match(patt, s)
end</div>

作为instring.gsub,替换值可以是一个字串、函数,或者一个表.

逗号分隔值(CSV)

下面的例子将字符串转换成逗号分隔的值,并返回所有的字段:

                    lpeg.C((1 - lpeg.S',\n"')^0)

local record = field * (',' * field)^0 * (lpeg.P'\n' + -1)

function csv (s)
  return lpeg.match(record, s)
end</div>

一个字段或是一个引用的字段(一族可能包含任何字符除单引号,或双引号)或是一个未被引用的字段(不包含逗号,换行符或引号)。一个记录就是一个用逗号分隔的字段列表(以换行符或以字符串结尾)。

就像这样,前面的匹配返回的每个字段都是独立返回的。若我们添加一个列表截取定义的记录。返回的将不再是一个独立的包含所有字段的

您可能想查找下面的文章:

  • Lua中基本的数据类型、表达式与流程控制语句讲解
  • 深入探究Lua中的解析表达式
  • Lua教程(三):表达式和语句

相关文章

  • Lua脚本自动生成APK包
  • vs2012 error c4996: This function or variable may be unsafe
  • Lua中的一些常用函数库实例讲解
  • Lua中使用元表(metatable)执行算术类元方法实例
  • 在Lua中使用模块的基础教程
  • Lua中调用C++函数示例
  • Lua中的metatable介绍
  • Lua中获取table长度问题探讨
  • C++遍历Lua table的方法实例
  • Lua中string.lower()使用指南

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua中的迭代器和泛型for学习总结
    • Lua中数字for循环实例
    • Lua中的loadfile、dofile、require详解
    • Lua教程(三):表达式和语句
    • Lua中算术运算符的使用示例
    • Lua中调用C++函数示例
    • Lua中__index和__newindex之间的沉默与合作
    • Lua中的文件I/O操作教程
    • 编写高性能Lua代码的方法
    • Lua面向对象之多重继承、私密性详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有