目录

Lua正则表达式

正则表达式

 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