Lua 模式匹配 vs 正则表达式
众所周知,Lua 遵循的模式匹配设计与通常基于**POSIX**的正则表达式设计有很大不同。
它们之间几乎没有共同点,并且在两者中,**POSIX** 是一种更受欢迎的方法,因为它在示例变得更复杂时效果很好,并且可以处理各种情况,但这并不意味着 Lua 的模式匹配不好。事实上,它更容易理解,并且也能完美地工作。
**Lua** 字符串库使用一组特殊的字符用于语法匹配,而不是使用正则表达式。两者可能非常相似,但 Lua 模式匹配更受限制并且具有不同的语法。
虽然可以很容易地理解,在某些情况下 POSIX 设计优于 Lua 的模式匹配,但在以下几点中,我将尝试讨论为什么 Lua 的模式匹配设计也更可取。
请考虑以下几点:
- **引用**极其简单且规则。引用字符为 %,因此它始终与字符串引用字符 \ 不同,这使得 Lua 模式比 POSIX 正则表达式(当需要引用时)更容易阅读。
- Lua 有一个与“最长匹配”* 运算符一起使用的“最短匹配”修饰符。例如,s:find '%s(%S-)%:' 查找以空格开头并以冒号结尾的最短非空格(不匹配)字符序列。
- Lua 提供了**“捕获”**,并且可以将多个捕获作为匹配调用的结果返回。此接口比通过副作用捕获子字符串或拥有必须对其进行查询以查找捕获的某些隐藏状态要好得多。您可以使用括号捕获语法。
- 模式匹配的语法非常**轻量级**,常见的字符类型包括大写字母**(%u)**、十进制数字**(%d)**、空格字符**(%s)**等。任何字符类型都可以通过使用相应的大写字母来补充,因此模式 %S 匹配任何非空格字符。
- 还有 %bxy,它匹配一对平衡的分隔符,例如括号或大括号。在 POSIX 正则表达式中无法进行平衡括号匹配。
以上所有要点都表明,Lua 的模式匹配模型绝对是一个值得使用的工具。
广告