Lua - 模式匹配
模式匹配是一个非常有用的功能,用于搜索和操作字符串。Lua 通过 string 库的方法提供内置的模式匹配支持。Lua 提供了一种简洁高效的方式,根据指定的模式来操作字符串。
Lua 模式匹配遵循一组特殊字符和规则,这些规则决定了我们可以用来自定义字符串搜索的模式。它不像 Java 或 C++ 等其他编程语言中的正则表达式那样全面,但对于大多数文本处理任务来说已经足够。它轻量级且内置,无需包含额外的库,因此具有语言的直接支持。
模式语法
特殊字符
以下是可以在 Lua 中用于创建强大模式的特殊字符列表。
. (点) − 匹配任意单个字符。
%a − 匹配任意字母。
%c − 匹配任意控制字符。
%d − 匹配任意数字。
%g − 匹配除空格外的任意可打印字符。
%l − 匹配任意小写字母。
%p − 匹配任意标点字符。
%s − 匹配任意空白字符(空格、制表符、换行符等)。
%u − 匹配任意大写字母。
%w − 匹配任意字母数字字符(字母或数字)。
%x − 匹配任意十六进制数字。
%z − 匹配表示为 0 的字符。
%x (其中 x 为非字母数字字符) − 表示字符 x 本身。主要用于转义特殊字符。例如,%. 匹配字面点,%+ 匹配字面加号,依此类推。
集合
[Set] 表示法用于匹配字符类,以匹配某个范围或集合内的字符。例如,要匹配小写字母,可以使用 [a-z],要匹配数字,可以使用 [0-9]。可以在开头使用 ^ 来否定表达式。例如,[^0-9] 可用于匹配不包含数字的模式。
量词
量词 用于匹配文本中特定字符或字符组的出现次数。
* − 匹配零次或多次出现。
+ − 匹配一次或多次出现。
- − 以贪婪方式匹配零次或多次出现。
? − 匹配零次或一次出现。
锚点
锚点 用于匹配文本中模式的位置。
^ − 匹配字符串的开头。
$ − 匹配字符串的结尾。
捕获
括号 () 用于捕获捕获字符串的一部分。
示例 - 使用模式
main.lua
local text = "First 123 then 456."
-- 搜索任意数字序列
local start, finish = string.find(text, "%d+")
print("Digit sequence:", string.sub(text, start, finish)) -- 输出 Digit sequence: 123
-- 搜索字符串开头的模式
local start, finish = string.find(text, "^First")
if start then
print("Sentence starts with 'First'") -- 输出 Sentence starts with 'First'
end
-- 搜索字符串结尾的模式
local start, finish = string.find(text, "%d+%$")
if not start then
print("Sentence does not end with digits.") -- 输出 Sentence does not end with digits.
end
输出
运行上述程序时,我们将得到以下输出−
Digit sequence: 123 Sentence starts with 'First' Sentence does not end with digits.