正则表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
上面字符类的大写形式表示小写所代表的集合的补集。例如, '%A'非字母的字符:
特殊字符
'%' 用作特殊字符的转义字符
'%.' 匹配 .
'%%' 匹配字符 '%'
用'[]'匹配字符集中的字符一次
'[%w_]' 匹配字母数字和下划线
'[01]' 匹配二进制数字
'[%[%]]'匹配一对方括号
在'[]'中使用连字符'-'
'%d' 表示 '[0-9]';
'%x' 表示 '[0-9a-fA-F]'
'[0-7]' 表示 '[01234567]'
在'[]'开始处使用 '^' 表示其补集:
'[^0-7]' 匹配任何不是八进制数字的字符;
'[^\n]' 匹配任何非换行符户的字符。
'[^%s]' == '%S'
模式修饰符
^ 匹配字符串开头
$ 匹配字符串结尾
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次,最长匹配
- 匹配前一字符0次或多次,最短匹配
? 匹配前一字符0次或1次
|
查找
string.find(s, pattern [, init [, plain]])
s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
init : 搜索的起始位置
plain : 默认为false,true时关闭匹配正则模式
将查找目标模板在给定字符串中出现的位置,找到返回起始和结束位置,没找到返回nil
- 注:find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号,那么表示会“捕捉”括号括起来的模式匹配到的字符串,并且作为返回值,从第三个返回值开始返回所有匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
print(string.find("hello, world", "%s", 2))
=> 7 7
print(string.find("hello, world", "%s", 8)
=> nil
print(string.find("hello, world", "%s", 0, true)
=> nil
print(string.find("hello, world", " ", 0, true))
=> 7 7
-- 其中%1表示拷贝匹配到的第一个内容,同样的%n来拷贝匹配到的第n个内容
print(string.find("abc \"it's a cat\"", "([\"'])(.-)%1"))
=> 5 16 " it's a cat
|
string.match(s, pattern [, init])
s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
init : 搜索的起始位置
将查找目标模板在给定字符串中出现的匹配字符,如果没有,返回nil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
print(string.match("hello, world", "%S%s%S"))
=> , w
print(string.match("hello, world", "%S%s%S", 8))
=> nil
print(string.match("hello, world", "(hello), world"))
=> hello
注:如果pattern中有用()起来的,那么只返回()中的内容,如果多个括号,返回多个值
print(string.match("hello, world", "(hello), (world)"))
=> hello world
-- 其中%1表示拷贝匹配到的第一个内容,同样的%n来拷贝匹配到的第n个内容
print(string.match("abc \"it's a cat\"", "([\"'])(.-)%1"))
=> " it's a cat
|
string.gmatch (s, pattern)
s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
返回一个迭代器函数,每一次调用这个函数,返回一个在字符串s找到的下一个符合pattern描述的子串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
local str = "hello, world"
local iter = string.gmatch(str, "%S")
for w, v in iter do
print(w)
end
=>
h
e
l
l
o
,
w
o
r
l
d
|
替换
string.gsub (s, pattern, repl [,m])
s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
repl : 需要替换成的字符串
[, m] : 只看s的前m个字符
将pattern中匹配到的字符串替换成repl字符串,repl可以是string,也可以是个函数,或是table,如果是函数,就会用捕获的内容作为参数调用该函数,将返回的内容作为替换字符串。如果是table,则用捕获的内容为key去取table的值来作为替换字符串,如果不存在,就不做替换
返回值 : 替换后的字符串, 替换的次数
- 注:把源字符串当做gsub的第一个参数传入后,方法执行并不会修改源字符串,需要重新赋值接收才能获取到修改后的字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
local str = "hello, world"
print(string.gsub(str, "hello", "hi"))
=> hi, world 1
local str = "hello, world"
print(string.gsub(str, ".", function(pattern)
if pattern == "l" then
return "abc"
end
return pattern
end))
=> heabcabco, worabcd 12
function expand(s)
return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))
=> Lua is great, isn't it? 2
|