luastring.find
函数原型 string.find(s, pattern [, init [, plain]] )
s: 源字符串
pattern: 待搜索模式串
init: 可选,起始位置
plain: 我没⽤过
①⼦串匹配:
[plain]
1. print(string.find("haha", 'ah') ) ----- 输出 2 3
注意: lua ⾥⾯数组或者字符串的字符,其下标索引是从 1 开始,不是 0
string.find 默认情况下返回两个值,即查到的⼦串的起⽌下标,如果不存在匹配返回 nil。
如果我们只想要 string.find 返回的第⼆个值,可以使⽤虚变量(即下划线)
[plain]
1. _, q=string.find("haha", 'ah')
2. print(q) ----- 输出 3
②模式匹配:
[plain]
1. pair = " name = Anna "
2. print(string.find(pair, "(%a+)%s*=%s*(%a+)") ---- 输出 2 12 name Anna
解释:
lua字符串转数组如果 find 的第⼆个参数使⽤了某种匹配模式,并且模式串⾥⾯带括号。那么表⽰会“捕捉”括号括起来的模式匹配到的字符串。捕捉,当然会把他们作为返回值。这⾥捕捉了两下,所以 find 多返回了两个值
那么,这个模式是怎么匹配的呢?
Lua ⽀持的字符类有:
. 任意字符
%s 空⽩符
%p 标点
%c 控制字符
%d 数字
%x ⼗六进制数
%z 代表0的字符
%a 字母
%l ⼩写字母
%u ⼤写字母
%w 字母数字
字符类的⼤写形式代表相应集合的补集,⽐如 %A 表⽰除了字母以外的字符集
另外,* + - 三个,作为通配符分别表⽰:
*:匹配前⾯指定的 0 或多个同类字符,尽可能匹配更长的符合条件的字串
+:匹配前⾯指定的 1 或多个同类字符,尽可能匹配更长的符合条件的字串
-:匹配前⾯指定的 0 或多个同类字符,尽可能匹配更短的符合条件的字串
于是, "(%a+)%s*=%s*(%a+)" 表⽰,先匹配⼀个或多个字母,然后是零个或多个空⽩符(⽐如空格),然后是个 '=',然后空⽩符,然后字母。这样,满⾜匹配的只有 "name = Anna"。所以输出位置为 2 12.
因为捕获了两个 (%a+),也就是 name, Anna 这两个单词,所以还输出了这两个单词
另外, lua 使⽤ %1-%9 表⽰拷贝捕获。举例说:
[plain]
1. s="abc \"it's a cat\""
2. _,_,_,q=string.find(s, "([\"'])(.-)%1")
3. print(q) -----输出: it's a cat
⾸先, [\"'] 表⽰匹配双引号或者单引号,因为有括号,所以引号被捕获。然后匹配⼏个任意字符并且捕获他,最后 %1 匹配与第⼀次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 "it's a cat", ⽽第⼆次捕获的是去掉两头引号的字串,即 it's a cat.
还有, '-' 与 '*' 到底有什么不同呢?在上⾯, "([\"'])(.*)%1" 匹配到的结果与 '-' 是⼀样的。尽可能匹配更长,尽可能匹配更短究竟什么不同呢?看例⼦:
[plain]
1. print( ("\"hello\" \"hello\""):find('"(.+)"') ) ----输出 1 15 hello" "hello
2. print( ("\"hello\" \"hello\""):find('"(.-)"') ) ----输出 1 7 hello
* 尽可能长,所以匹配了⾸尾两个引号,捕获了中间的 (hello" "hello)
-
尽可能短,所以碰到第⼆个引号就说匹配完了,因此只捕获了第⼀个 (hello)
原⽂链接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论