在 Lua 中 match 函数只寻找源字串 str 中的第一个配对,参数 init 可选, 指定搜寻过程的起点, 默认为 1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串,当没有成功的配对时, 返回 nil。
string.match(str, pattern, init)
参数 | 描述 |
---|---|
str | 源字符串 |
pattern | 模式 |
init | 开始索引 |
返回匹配结果,当没有成功的配对时, 返回 nil。
使用字符串的 match 函数进行查找时,是支持正则查找的,具体正则如下:
正则 | 描述 |
---|---|
.(点) | 与任何字符配对 |
%a | 与任何字母配对 |
%c | 与任何控制符配对(例如 \n) |
%d | 与任何数字配对 |
%l | 与任何小写字母配对 |
%p | 与任何标点(punctuation)配对 |
%s | 与空白字符配对 |
%u | 与任何大写字母配对 |
%w | 与任何字母/数字配对 |
%x | 与任何十六进制数配对 |
%z | 与任何代表 0 的字符配对 |
%x | (此处 x 是非字母非数字字符) 与字符 x 配对。主要用来处理表达式中有功能的字符 (^$()%.[]*+-?) 的配对问题,例如 %% 与 % 配对 |
[数个字符类] | 与任何 [] 中包含的字符类配对,例如 [%w_] 与任何字母 / 数字, 或下划线符号 (_) 配对 |
[^数个字符类] | 与任何不包含在[]中的字符类配对. 例如[^%s] 与任何非空白字符配对 |
当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对。例如, %S 表示与任何非空白字符配对,例如,’%A’ 非字母的字符。
‘%’ 用作特殊字符的转义字符,因此 ‘%.’ 匹配点;’%%’ 匹配字符 ‘%’。转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。
模式条目可以是:
*
’, 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串;+
’, 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串;-
’, 将匹配零或更多个该类的字符。 和 ‘*
’ 不同, 这个条目总是匹配尽可能短的串;?
’, 将匹配零或一个该类的字符。 只要有可能,它会匹配一个;%*n*
, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。%b*xy*
, 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b()
可以匹配到括号平衡的表达式。%f[*set*]
, 指边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 ‘\0
’ 一样。使用 match() 函数,实现字符串匹配
#!/usr/bin/lua
print("haicoder(www.haicoder.net)\n")
print(string.match("I have 2 questions for you.", "%d+ %a+"))
print(string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")))
程序运行后,控制台输出如下:
我们使用了 string.match 实现了字符串匹配。
在 Lua 中 match 函数只寻找源字串 str 中的第一个配对,参数 init 可选, 指定搜寻过程的起点, 默认为 1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串,当没有成功的配对时, 返回 nil。