跳到主要内容

Lua匹配模式

什么是匹配模式

匹配模式也是一串字符串内容,能通过zm.RegExMatch 正则匹配zm.RegExMatchEx 正则子匹配zm.RegExReplace 正则替换等函数命令实现按规则描述提取指定数据内容。

与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式(也写作RegExp)来进行匹配,而是进行了一些精简优化来实现强大的功能。

语法

字符类

字符类用于表示一个字符集合。

  • .(一个点) : 可表示任何字符。
  • %a : 表示任何字母。
  • %c : 表示任何控制字符。
  • %d : 表示任何数字。
  • %g : 表示任何除空白符外的可打印字符。
  • %l : 表示所有小写字母。
  • %p : 表示所有标点符号。
  • %s : 表示所有空白字符。
  • %u : 表示所有大写字母。
  • %w : 表示所有字母及数字。
  • %x : 表示所有 16 进制数字符号。
  • %z : 表示 \0 的字符。
  • %% : 表示字符 %。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个 % 放在模式串中表示自身。
  • [set] : 表示 set 中所有字符的联合。 可以以 - 连接,升序书写范围两端的字符来表示一个范围的字符集。 其它出现在 set 中的字符则代表它们自己。 例如,[%w\_] (或 [\_%w]) 表示所有的字母数字加下划线), [0-7] 表示 8 进制数字, [0-7%l%-] 表示 8 进制数字加小写字母与 - 字符。
  • [^set] : 表示 set 的补集,也就是不包含 set , 其中 set 如上面的解释。

所有单个字母表示的类别(%a%c,等), 若将其字母改为大写,均表示对应的补集。 例如,%S 表示所有非空格的字符。

模式条目

  • 单个字符类匹配该类别中任意单个字符
  • 单个字符类跟一个 *, 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串
  • 单个字符类跟一个 +, 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串;
  • 单个字符类跟一个 -, 将匹配零或更多个该类的字符。 和 * 不同, 这个条目总是匹配尽可能短的串;
  • 单个字符类跟一个 ?, 将匹配零或一个该类的字符。 只要有可能,它会匹配一个;
  • %n, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。
  • %bxy, 这里的 xy 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 xy 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b() 可以匹配到括号平衡的表达式。
  • %f[set], 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 '\0' 一样。

模式

模式 指一个模式条目的序列。 在模式最前面加上符号 ^ 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 $ 将使匹配过程锚定到字符串的结尾。 如果 ^$ 出现在其它位置,它们均没有特殊含义,只表示自身。

捕获

模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 (a*(.)%w(%s*)) , 字符串中匹配到 a*(.)%w(%s*) 的部分保存在第一个捕获物中 (因此是编号 1 ); 由 . 匹配到的字符是 2 号捕获物, 匹配到 %s* 的那部分是 3 号。

作为一个特例,空的捕获 () 将捕获到当前字符串的位置(它是一个数字)。 例如,如果将模式 ()aa() 作用到字符串 "flaaap" 上,将产生两个捕获物: 3 和 5 。