前言#
今天我们再一起看一个string家族的匹配函数,它不同于函数string.find()
要返回匹配字符的索引,也不同于string.gmatch()
函数会返回一个迭代函数可以取到所有的匹配项,这个函数它仅仅范回第一个匹配,简单易用,往往在一些实际应用中找到第一个匹配就够了,我们一起来看一下用法。
string.match()##
- 原型:string.match(s, pattern [, init])
- 解释:在字符串
s
中查找满足参数pattern
的匹配子串,如果找到了一个匹配就返回这个匹配子串,若没找到则返回nil
,如果参数pattern
没有指定匹配参数,则返回整个匹配字符串——"If pattern specifies no captures, then the whole match is returned."(这一句我翻译的不太靠谱啊,有问题麻烦大家给我指正一下),另外,一个数字形参数init
用来指定查找字符串的其实位置,这个参数默认为1,当然也可以设置为负数,即-n
表示从字符串尾部向前数n个字符开始查找。
Usage##
- 首先新建一个文件将文件命名为matchtest.lua然后编写如下代码:
local sourcestr = "ehre99wj=--=-*-/4mdqwl\0ds123fef"
print("\nsourcestr = "..sourcestr)
local match_ret = string.match(sourcestr, "%d%d%d")
print("\nmatch_ret is "..match_ret)
match_ret = string.match(sourcestr, "%d%a%a")
print("\nmatch_ret is "..match_ret)
match_ret = string.match(sourcestr, "")
print("\nmatch_ret is "..match_ret)
match_ret = string.match(sourcestr, "%d%d")
print("\nmatch_ret is "..match_ret)
match_ret = string.match(sourcestr, "%d%d", 10)
print("\nmatch_ret is "..match_ret)
- 运行结果
总结#
- 由第一组结果可以看出
string.match()
在遇到\0
时不会停止查找,而是一直查找到字符串结尾。 - 最后两组结果对比可以发现参数
init
的作用,他指定了搜索匹配的起始位置。 - 这一篇中有一个关于官方文档的翻译的疑惑,就是"If pattern specifies no captures, then the whole match is returned.",我总感觉我怎么翻译都不太对,麻烦明白的大神给我讲一下是什么意思,其实给我举个例子就明白了。