lua中的捕获(capture)

说到捕获,就要先说模式。

说到模式,就要先说字符分类。

字符分类是这个意思,%d代表数字,%a代表字母,%p代表标点字符,等等这样的就是字符分类,下面贴一张完整的表格

再说模式,模式粗略来说可以理解为字符分类的组合成了一个模式。比如:%d%d/%d%d/%d%d%d%d可以搜索dd/mm/yyyy格式的日期。

在模式中还存在一些魔法字符,它们具有特殊的含义。比如:

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

这样的就是特殊字符,我就不解释每个字符什么意思了,都知道。

对于lua来说,模式就是普通的字符串。但是模式只有在模式函数中才会发挥作用。至于什么是模式函数,我觉得是g开头的函数,比如string.gsub string.gmatch 不过我也不确定,可以留言交流。

接下来说一说捕获,捕获其实就是根据一个模式从目标字符串中抽出匹配于该模式的内容。在指定捕获时,应将模式中需要捕获的部分写到一对圆括号中。

比如:

pair = "name = Anna"

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

print(key, value) -->name Anna

对于具有捕获的模式,函数string.match会将所有捕获到的值作为单独的结果返回。它会将目标字符串切成多个捕获到的部分并返回。

假设要在一个字符串中寻找一个由单引号或双引号括起来的子串。那么可以用这样的模式"["'].-["']",它表示一个引号后面是任意内容及另外一个引号。但是,这种模式在处理像"it's all right"这样的字符串就会出问题。要解决这个问题,可以捕获第一个引号,然后用它来指定第二个引号:

s = [[then he said: "it's all right"!]]

q, quotedPart = string.match(s, "([\"'])(.-)%1")

print(quotedPart) -->it's all right

print(q) -->"

第一个捕获是引号字符本身,第二个捕获是引号中的内容,即与".-"相匹配的子串。

上面的%1表示和前面相同的引号([\"'])