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

Lua中的捕获机制和转换技巧介绍

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

junjie 通过本文主要向大家介绍了lua for循环机制,lua热更新机制,三辊闸psua0d51lua,lua文件解密,lua等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

捕获

捕获是这样一种机制:可以使用模式串的一部分匹配目标串的一部分。将你想捕获的模式用圆括号括起来,就指定了一个捕获。

在string.find使用捕获的时候,函数会返回捕获的值作为额外的结果。这常被用来将一个目标串拆分成多个:
pair = "name = Anna"
_, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)    --> name  Anna
</div>

'%a+' 表示菲空的字母序列;'%s*' 表示0个或多个空白。在上面的例子中,整个模式代表:一个字母序列,后面是任意多个空白,然后是 '=' 再后面是任意多个空白,然后是一个字母序列。两个字母序列都是使用圆括号括起来的子模式,当他们被匹配的时候,他们就会被捕获。当匹配发生的时候,find函数总是先返回匹配串的索引下标(上面例子中我们存储哑元变量 _ 中),然后返回子模式匹配的捕获部分。下面的例子情况类似:

date = "17/7/1990"
_, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y)      --> 17 7 1990   
</div>

我们可以在模式中使用向前引用,'%d'(d代表1-9的数字)表示第d个捕获的拷贝。

看个例子,假定你想查找一个字符串中单引号或者双引号引起来的子串,你可能使用模式 '["'].-["']',但是这个模式对处理类似字符串 "it's all right" 会出问题。为了解决这个问题,可以使用向前引用,使用捕获的第一个引号来表示第二个引号:
s = [[then he said: "it's all right"!]]
a, b, c, quotedPart = string.find(s, "(["'])(.-)%1")
print(quotedPart)    --> it's all right
print(c)            --> " 
</div>
第一个捕获是引号字符本身,第二个捕获是引号中间的内容('.-' 匹配引号中间的子串)。

捕获值的第三个应用是用在函数gsub中。与其他模式一样,gsub的替换串可以包含 '%d',当替换发生时他被转换为对应的捕获值。(顺便说一下,由于存在这些情况,替换串中的字符 '%' 必须用 "%%" 表示)。下面例子中,对一个字符串中的每一个字母进行复制,并用连字符将复制的字母和原字母连接起来:

print(string.gsub("hello Lua!", "(%a)", "%1-%1"))
    --> h-he-el-ll-lo-o L-Lu-ua-a! 
</div>
下面代码互换相邻的字符:
print(string.gsub("hello Lua", "(.)(.)", "%2%1"))
    --> ehll ouLa 
</div>

让我们看一个更有用的例子,写一个格式转换器:从命令行获取LaTeX风格的字符串,形如:

\command{some text}
</div>
将它们转换为XML风格的字符串:
<command>some text</command>
</div>
对于这种情况,下面的代码可以实现这个功能:
s = string.gsub(s, "\\(%a+){(.-)}", "<%1>%2</%1>") 
</div>
比如,如果字符串s为:
the \quote{task} is to \em{change} that.
</div>
调用gsub之后,转换为:
the <quote>task</quote> is to change that.
</div>

另一个有用的例子是去除字符串首尾的空格:
function trim (s)
    return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end 
</div>
注意模式串的用法,两个定位符('^' 和 '$')保证我们获取的是整个字符串。因为,两个 '%s*' 匹配首尾的所有空格,'.-' 匹配剩余部分。还有一点需要注意的是gsub返回两个值,我们使用额外的圆括号丢弃多余的结果(替换发生的次数)。

最后一个捕获值应用之处可能是功能最强大的。我们可以使用一个函数作为string.gsub的第三个参数调用gsub。在这种情况下,string.gsub每次发现一个匹配的时候就会调用给定的作为参数的函数,捕获值可以作为被调用的这个函数的参数,而这个函数的返回值作为gsub的替换串。先看一个简单的例子,下面的代码将一个字符串中全局变量$varname出现的地方替换为变量varname的值:
function expand (s)
    s = string.gsub(s, "$(%w+)", function (n)
      return _G[n]
    end)
    return s
end

name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))

--> Lua is great, isn't it?
</div>
如果你不能确定给定的变量是否为string类型,可以使用tostring进行转换:
function expand (s)
    return (string.gsub(s, "$(%w+)", function (n)
      return tostring(_G[n])
    end))
end

print(expand("print = $print; a = $a"))

--> print = function: 0x8050ce0; a = nil

</div>
下面是一个稍微复杂点的例子,使用loadstring来计算一段文本内$后面跟着一对方括号内表达式的值:
s = "sin(3) = $[math.sin(3)]; 2^5 = $[2^5]"
print((string.gsub(s, "$(%b[])", function (x)
    x = "return " .. string.sub(x, 2, -2)
    local f = loadstring(x)
    return f()
end)))

--> sin(3) = 0.14112

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

  • 简单讲解Lua中的垃圾回收机制
  • Lua中for循环语句的使用教程
  • Lua中的捕获机制和转换技巧介绍

相关文章

  • Lua中的repeat...until循环语句使用教程
  • Lua在windows下的安装及环境配置
  • Lua数据类型介绍
  • Lua性能优化技巧(六):最后的提示
  • Lua中数字for循环实例
  • Lua中变相实现continue跳出循环
  • Lua的内存管理浅析
  • Lua中类的实现原理探讨(Lua中实现类的方法)
  • Lua性能优化技巧(一):前言
  • Lua判断Table是否为空的方法(空的table即{})

文章分类

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

最近更新的内容

    • 简单谈谈lua和c的交互
    • Lua中os库详细介绍
    • Mac平台中编译安装Lua运行环境及Hello Lua实例
    • Lua中的闭合函数、非全局函数与函数的尾调用详解
    • Lua 学习笔记之C API 遍历 Table实现代码
    • 编写高性能Lua代码的方法
    • Lua脚本调用外部脚本
    • 让你的python代码更加pythonic(简练、明确、优雅)
    • Lua编程示例(五): C语言对Lua表的读取和添加
    • Lua中ipair和pair的区别

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

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