Lua模式匹配

lua string 库使用模式匹配来处理字符串的查找和替换,但是它的正则表达式与一般的POSIX规范的正则表达式不一样。因为要保持程序精简。(只用了500行代码就实现咯)

模式:

  • %a 匹配字母
  • %c 匹配控制字符
  • %d 数字
  • %l 小写字母
  • %p 标点字符
  • %s 空白符
  • %u 大写字母
  • %w 字母和数字
  • %x 十六进制数字
  • %z 代表0的字符
  • ^ 一行的开头
  • $ 一行的结束
  • %b 匹配以 x 开头, y 结束的字符

  • 以上字符类的大写,表示该字符类的补集。 比如%A 表示非字母的字符。

  • % 是模式中的转义字符(需要转义的特殊字符:( ) . % + - * ? [ ] ^ $ ),
  • \ 是LUA中字符串的转义字符( “ , “)

  • 可以用 [] 方括号来定义字符集如

    • [%w_] 用于匹配字母数字和下划线
    • [%[%]] 用于匹配 一对方括号
    • [0-9] 用于匹配数字, 与%d一样
    • [0-9a-fA-F] 与%x一样,匹配十六进制数字
    • [^xxx] 不包含后面的字符
  • 在一个字符集的前面加一个 ^ 可以得到它的补集。

模式修饰符

  • + 匹配前一字符1次或多次
  • * 匹配前一字符0次或多次
  • - 匹配前一字符0次或多次
  • \? 匹配前一字符0次或1次
1
2
3
4
%a+   匹配一个字母,多个字母,或一个单词
%d+ 匹配一个或多个数字
%a* 比%a+ 多匹配一个空白
%a- 与 %a*类似,不过是最短(懒惰)匹配,在能匹配到整个表达式的情况下,取 最短的

贪婪与懒惰匹配

捕获

  • 捕获机制允许一个模式串中的一部分来匹配目标串种的一部分。写法是模式串中你需要捕获的那部分用()括起来,例如:

    1
    2
    3
    local pair = "name = anna"
    local key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
    print(key, value) --> name anna
  • 我们也可以将捕获用于模式串自身,”([\”‘])(.-)%1”,这里的%1表示匹配第一个捕获的一份拷贝。

  • () 捕获的不是空内容, 而是捕获在目标字符串中的位置

https://leafflow.top/2023/02/07/lua/lua正则/
作者
vollen
发布于
2023年2月7日
许可协议