1、模式匹配函数

1.1、string.find

在目标字符串中搜索模式,返回两个值,匹配位置的开始和结束位置。如果没有匹配,返回nil

当匹配时,使用string.sub带上string.find返回的参数返回 的是匹配的字符串。

string.find有另外两个可选参数,第三个表示搜索的开始位置,第四个表示是否是纯文本搜索。

print(string.find("a [word]", "["))

会报错

lua string find 从末尾 string.find lua_lua string find 从末尾

print(string.find("a [word]", "[", 1, true))

输出

lua string find 从末尾 string.find lua_lua string find 从末尾_02

1.2 string.match

与string.find相似,返回值不同,返回 的是匹配的子串。

匹配日期模式

print(string.match("Today is 17/7/1990", "%d+/%d+/%d+"))

1.3 string.gsub

全局替换,返回的第二个参数表示完成替换的次数

s = string.gsub("Lua is cute", "cute", "greate")
print(s)
s = string.gsub("all lii", "l", "x")
print(s)
s = string.gsub("Lua is great", "Sol", "Sun")
print(s)

输出:

lua string find 从末尾 string.find lua_lua_03

1.4 string.gmatch

返回一个迭代所有模式出现的函数。

s = "some string"
words = {}
for w in string.gmatch(s, "%a+") do
    print(w)
    words[#words + 1] = w
end

输出:

lua string find 从末尾 string.find lua_字符串_04

2、模式

lua使用%作为转义字符

支持的字符类有

.

表示所有字符

%a

表示字母

%c

表示控制符

%d

表示数字

%g

表示除去空格的可打印字符

%l

表示小写字母

%p

表示标点符号字符

%s

表示空格字符

%u

表示大写字母

%w

表示字母+数字

%x

表示十六进制字符

上述的大写表示表示对应字符集的补集

 2.1 魔法字符

包含( ) . % + - * ? [ ] ^ $

自定义字符集使用[]方括号。在方括号中也可以定义范围,在第一个字符与最后一个字符之间添加中划线。

自定义字符补集使用[^]形式。

2.2 重复次数和可选项

其修饰符包含

+

1次或者更多次

*

0次或者更多次,最长匹配

-

0次或者更多次(懒形式),最短匹配

?

可选(0或者1)

test = "int x; /* x */ int y; /* y */"
print((string.gsub(test, "/%*.*%*/", "")))

输出为

lua string find 从末尾 string.find lua_lua_05

test = "int x; /* x */ int y; /* y */"
print((string.gsub(test, "/%*.-%*/", "")))

输出为

lua string find 从末尾 string.find lua_lua_06

2.3 其它元字符

^

开始匹配

$

结尾匹配

%b

匹配平衡字符串。%bxy, x表示开始字符,y表示结束字符

%f[char-set]

当下一字符在字符集内,而前一个字符不在时用于匹配空字符串

s = "a (enclosed (in) parentheses) line"
print((string.gsub(s, "%b()", "")))

输出为:
a  line


s = "the anthem is the theme"
print((string.gsub(s, "%f[%w]the%f[%W]", "one")))
输出为:
one anthem is one theme

3、捕获

在括号内写模式的部分来实现捕获。当模式有捕获时,string.match返回捕获的值。

()用于捕获位置,返回 的是数字

print(string.match("hello", "()ll()")) 输出: 3 5


pair = "name = Anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)

输出:
name	Anna

date = "Today is 17/7/1990"
d, m, y = string.match(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y)

输出:
17	7	1990

3.1 捕获引用

使用%n,其中n表示第n个捕获

s = [[then he said: "it's all right"!]]
q, quotedPart = string.match(s, "([\"'])(.-)%1")
print(q, quotedPart)

输出:
"	it's all right

p = "%[(=*)%[(.-)%]%1%]"
s = "a = [=[[[ something ]] ]==] ]=]; print(a)"
print(string.match(s, p))

输出:
=	[[ something ]] ]==]

string.gsub替换中使用捕获。%0表示整个匹配。

print((string.gsub("hello, Lua!", "%a", "%0-%0")))

输出:
h-he-el-ll-lo-o, L-Lu-ua-a!