Lua模式匹配

104 阅读2分钟

Lua模式匹配

模式匹配相关函数

在string标准库中,使用了pattern进行匹配操作有4个相关函数,find()、match()、gsub()、gmatch()。

1. string.find()

image.png

string.find(str, pattern, option:index, option:isSimple)

  • str: 目标字符串
  • pattern: 匹配字符串
  • index: 从目标字符串中的哪个位置开始搜索
  • isSimple: 是否进行简单搜索,忽略pattern等正则表达

string.find 用于在指定的目标字符串中搜索指定模式,方法return 2个返回值。如果存在值会返回开始位置索引和结束位置索引,没有匹配返回nil。

s = "hello world"
i, j = string.find(s, "hello") --> 1, 5
string.sub(s, i, j)            --> hello
i, j = string.find(s, "l")     --> 33
string.find(s, "lll")          --> nil

2. string.match()

image.png string.match(str, pattern)

  • s :目标字符串
  • patten :匹配字符串

find返回index, match返回字符串

date = "Today is 17/7/1990"
d = string.match(date, "%d+/%d+/%d+") --> 17/7/1990

3. String.gsub

image.png

string.gsub(str, pattern, replaceStr, option: count)

  • str: 目标字符串
  • pattern:匹配字符串
  • replaceStr: 替换字符串
  • count: 替换次数

返回被替换之后的目标字符串 和 替换次数

string.gsub("Lua is cute", "cute", "great") --> Lua is great
string.gsub("all lii", "l", "x")            --> axx xii
string.gusb

string.gmatch

image.png

返回迭代器return所有的相匹配的字符串 string.gmatch(str, pattern, option:init)

  • str: 目标字符串
  • pattern: 匹配字符串
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
    print(w)
end

t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
    t[k] = v
end

模式(pattern)

Lua语言中模式使用百分号%作为转义,和C语言中的用法相同,所有被转义的字母都有特殊含义。所有非转义的字符代表本身"%"" 匹配一个双引号。

s = "Deadline is 30/05/1999, firm"
data = "%d%d/%d%d/%d%d%d%d"
string.match(s, date) --> 30/05/1999

image.png

在模式匹配中,().%+-*?[]11$, 这些字符包含特殊含义

也可以使用字符集来定义字符分类,例如'[%w_]' 匹配所有以下划线结尾的字母和数字,'[01]'匹配二进制数字, '[%[]]'匹配方括号, '[0-9]'表示所有数字。在字符前加修饰符号可以表示重复等含义。

image.png

捕获

简单来说就是使用括号将要匹配的字符合集返回出去, 每一个捕获都可以将所匹配到的值返回出去

date = "Deadline is 30/05/1999, firm"
d, m, y = string.match(date, "(%d+)/(%d+)/(%d+)") --> 30 05 1999