WEO啦

首页 » 正文内容 » Lua模式匹配
Lua模式匹配
收录时间:2022-11-25 23:03:46  浏览:0
LUA 模模式式匹匹配配 Posted on 2009 09 02 14 28 白耘 阅读 408 评论 0 编辑 收藏 所属分类 Lua 学习笔记 模式匹配函数 在 string 库***能最强大的函数是 string find 字符串查找 string gsub 全局字符串替换 string gfind 全局字符串查找 string gmatch 返回查找到字符串的迭代器 这些函数都是基于模式匹配的 与其他脚本语言不同的是 Lua 并不使用 POSIX 规范 的正则表达式 4 也写作 regexp 来进行模式匹配 主要的原因出于程序大小方面 的考虑 实现一个典型的符合 POSIX 标准的 regexp 大概需要 4000 行代码 这比整 个 Lua 标准库加在一起都大 权衡之下 Lua 中的模式匹配的实现只用了 500 行代码 当然这意味着不可能实现 POSIX 所规范的所有更能 然而 Lua 中的模式匹配功能是 很强大的 并且包含了一些使用标准 POSIX 模式匹配不容易实现的功能 string gmatch str pattern 这是一个返回迭代器的函数 实际的用例如下 s hello world from Lua for w in string gmatch s a do print w end 这里是一个捕获并将配对字符分别存到不同变量的例子 t s from world to Lua for k v in string gmatch s w w do t k v end for k v in pairs t do print k v end string gsub str pattern repl n string gsub 函数根据给定的配对表达式对源字符串 str 进行配对 同时返回源字符串的 一个副本 该副本中成功配对的所有子字符串都将被替换 函数还将返回成功配对的次 数 实际的替换行为由 repl 参数的类型决定 当 repl 为字符串时 所有成功配对的子字符串均会被替换成指定的 repl 字串 当 repl 为 table 时 对每个成功配对的子字符串 函数均会试图寻找以其为 key 值的 table 中的元素 并返回该元素 如果该配对包含任何捕获信息 则以编号为 1 号的捕获 作为 key 值进行查找 当 repl 为函数时 每个成功配对的子字符串均会作为参数被传入到该函数中去 在 repl 是 table 或函数时 如果该 table 或函数返回了字串或数字的值 这个值依然会被 用于替换副本字串中的配对子字串 如果该 table 函数返回的值为空 将不发生替换 n 参数可选 当它被指定时 string gsub 函数只对源字符串中的前 n 个成功配对的成员 进行操作 以下是几个例子 print string gsub hello world w 1 1 hello hello world world 2 print string gsub hello Lua w s w 2 1 Lua hello 1 string gsub hello world w print hello world 2 lookupTable hello hola world mundo print string gsub hello world w lookupTable hola mundo 2 string match str pattern init string match 只寻找源字串 str 中的第一个配对 参数 init 可选 指定搜寻过程的起点 默认为 1 在成功配对时 函数将返回配对表达式中的所有捕获结果 如果没有设置捕获标记 则返 回整个配对字符串 当没有成功的配对时 返回 nil string match abcdaef a a string reverse str 返回一个字符串的倒序排列 string reverse abcde edcba string dump function 返回指定函数的二进制代码 函数必须是一个 Lua 函数 并且没有上值 string find str pattern init plain string find 的基本应用就是用来在目标串 subject string 内搜索匹配指定的模式的串 函数如果找到匹配的串返回他的位置 否则返回 nil 最简单的模式就是一个单词 仅仅 匹配单词本身 比如 模式 hello 仅仅匹配目标串中的 hello 当查找到模式的时候 函 数返回两个值 匹配串开始索引和结束索引 s hello world string find s hello 1 5 string find s world 7 11 string find s l 3 3 string find s lll nil string find 函数第三个参数是可选的 标示目标串中搜索的起始位置 当我们想查找目 标串中所有匹配的子串的时候 这个选项非常有用 我们可以不断的循环搜索 每一次 从前一次匹配的结束位置开始 下面看一个例子 下面的代码用一个字符串中所有的新 行构造一个表 local t 存放回车符的位置 local i 0 while true do i string find s n i 1 查找下一行 if i nil then break end table insert t i end string sub str sPos ePos string gsub 的功能是截取字符串 他从指定起始位置截取一个字符串 string sub 可以利用 string find 返回的值截取匹配的子串 对简单模式而言 匹配的就是其本身 s hello world local i j string find s hello 1 5 string sub s i j hello string gsub str sourcestr desstr string gsub 的基本作用是用来查找匹配模式的串 并将使用替换串其替换掉 string gsub 函数有三个参数 目标串 模式串 替换串 s string gsub Lua is cute cute great print s Lua is great s string gsub all lii l x print s axx xii s string gsub Lua is great perl tcl print s Lua is great 第四个参数是可选的 用来***替换的范围 s string gsub all lii l x 1 print s axl lii s string gsub all lii l x 2 print s axx lii string gsub 的第二个返回值表示他进行替换操作的次数 例如 下面代码涌来计算一个 字符串中空格出现的次数 count string gsub str 注意 只是一个哑元变量 模式 你还可以在模式串中使用字符类 字符类指可以匹配一个特定字符***内任何字符的模 式项 比如 字符类 d 匹配任意数字 所以你可以使用模式串 d d d d d d d d 搜索 dd mm yyyy 格式的日期 s Deadline is 30 05 1999 firm date d d d d d d d d print string sub s string find s date 30 05 1999 下面的表列出了 Lua 支持的所有字符类 单个字符 除 外 与该字符自身配对 点 与任何字符配对 a 与任何字母配对 c 与任何控制符配对 例如 n d 与任何数字配对 l 与任何小写字母配对 p 与任何标点 punctuation 配对 s 与空白字符配对 u 与任何大写字母配对 w 与任何字母 数字配对 x 与任何十六进制数配对 z 与任何代表 0 的字符配对 x 此处 x 是非字母非数字字符 与字符 x 配对 主要用来处理表达式中有功能的字 符 的配对问题 例如 与 配对 数个字符类 与任何 中包含的字符类配对 例如 w 与任何字母 数字 或下划 线符号 配对 数个字符类 与任何不包含在 中的字符类配对 例如 s 与任何非空白字符配 对 当上述的字符类用大写书写时 表示与非此字符类的任何字符配对 例如 S 表示与 任何非空白字符配对 例如 A 非字母的字符 print string gsub hello up down A hello up down 4 数字 4 不是字符串结果的一部分 他是 gsub 返回的第二个结果 代表发生替换的次 数 下面其他的关于打印 gsub 结果的例子中将会忽略这个数值 在模式匹配中有一 些特殊字符 他们有特殊的意义 Lua 中的特殊字符如下 用作特殊字符的转义字符 因此 匹配点 匹配字符 转义字符 不仅可以用来转义特殊字符 还可以用于所有的非字母的字符 当对一个字符有疑 问的时候 为安全起见请使用转义字符转义他 对 Lua 而言 模式串就是普通的字符串 他们和其他的字符串没有区别 也不会受到特 殊对待 只有他们被用作模式串用于函数的时候 才作为转义字符 所以 如果你 需要在一个模式串内放置引号的话 你必须使用在其他的字符串中放置引号的方法来处 理 使用 转义引号 是 Lua 的转义符 你可以使用方括号将字符类或者字符 括起来创建自己的字符类 译者 Lua 称之为 char set 就是指传统正则表达式概念 中的括号表达式 比如 w 将匹配字母数字和下划线 01 匹配二进制 数字 匹配一对方括号 下面的例子统计文本中元音字母出现的次数 nvow string gsub text AEIOUaeiou 在 char set 中可以使用范围表示字符的*** 第一个字符和最后一个字符之间用连字 符连接表示这两个字符之间范围内的字符*** 大部分的常用字符范围都已经预定义好 了 所以一般你不需要自己定义字符的*** 比如 d 表示 0 9 x 表 示 0 9a fA F 然而 如果你想查找八进制数 你可能更喜欢使用 0 7 而不是 01234567 你可以在字符集 char set 的开始处使用 表示其补 集 0 7 匹配任何不是八进制数字的字符 n 匹配任何非换行符户的字 符 记住 可以使用大写的字符类表示其补集 S 比 s 要简短些 Lua 的字符类依赖于本地环境 所以 a z 可能与 l 表示的字符集不同 在 一般情况下 后者包括 和 而前者没有 应该尽可能的使用后者来表示字母 除非出于某些特殊考虑 因为后者更简单 方便 更高效 可以使用修饰符来修饰模式增强模式的表达能力 Lua 中的模式修饰符有四个 匹配前一字符 1 次或多次 匹配前一字符 0 次或多次 匹配前一字符 0 次或多次 匹配前一字符 0 次或 1 次 匹配一个或多个字符 总是进行最长的匹配 比如 模式串 a 匹配一个或 多个字母或者一个单词 print string gsub one and two and three a word word word word word word d 匹配一个或多个数字 整数 i j string find the number 1298 is even d print i j 12 15 与 类似 但是他匹配一个字符 0 次或多次出现 一个典型的应用是匹配空白 比如 为了匹配一对圆括号 或者括号之间的空白 可以使用 s s 用来匹配 0 个或多个空白 由于圆括号在模式中有特殊的含义 所以我们必须 使用 转义他 再看一个例子 a w 匹配 Lua 程序中的标示符 字 母或者下划线开头的字母下划线数字序列 与 一样 都匹配一个字符的 0 次或多次出现 但是他进行的是最短匹配 某 些时候这两个用起来没有区别 但有些时候结果将截然不同 比如 如果你使用模式 a w 来查找标示符 你将只能找到第一个字母 因为 w 永远匹 配空 另一方面 假定你想查找 C 程序中的注释 很多人可能使用 也 就是说 后面跟着任意多个字符 然后跟着 然而 由于 进行的 是最长匹配 这个模式将匹配程序中第一个 和最后一个 之间所有部分 test int x x int y y print string gsub test int x 然而模式 进行的是最短匹配 她会匹配 开始到第一个 之前的部分 test int x x int y y print string gsub test int x int y 匹配一个字符 0 次或 1 次 举个例子 假定我们想在一段文本内查找一个整数 整数可能带有正负号 模式 d 符合我们的要求 它可以匹配像 12 23 和 1009 等数字 是一个匹配 或者 的字符类 接下来的 意思是匹配前面的字符类 0 次或者 1 次 与其他系统的模式不同的是 Lua 中的修饰符不能用字符类 不能将模式分组然后使用 修饰符作用这个分组 比如 没有一个模式可以匹配一个可选的单词 除非这个单词只 有一个字母 下面我将看到 通常你可以使用一些高级技术绕开这个*** 以 开头的模式只匹配目标串的开始部分 相似的 以 结尾的模式只匹配目 标串的结尾部分 这不仅
温馨提示:
1. WEO啦仅展示《Lua模式匹配》的部分公开内容,版权归原著者或相关公司所有。
2. 文档内容来源于互联网免费公开的渠道,若文档所含内容侵犯了您的版权或隐私,请通知我们立即删除。
3. 当前页面地址:https://www.weo.la/doc/0e063b69b670b0cc.html 复制内容请保留相关链接。