lua学习笔记之模式查找

1、模式匹配函数

1.1、string.find

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

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

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

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

会报错

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

输出

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)

输出:

1.4 string.gmatch

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

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

输出:

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, "/%*.*%*/", "")))

输出为

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

输出为

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!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值