字符分类模式
- 模式中能够与一个特定集合中的任意字符相匹配的一项
- 如:模式:”%d%d/%d%d/%d%d%d%d”来匹配dd/mm/yyyy
| 字符分类及其对应 | |
| —- | —- |
| . | 所有字符 |
| %a | 字母 |
| %c | 控制符 |
| %d | 数字 |
| %g | 除空格外的可打印字符 |
| %l | 小写字母 |
| %p | 标点符号 |
| %s | 空格符号 |
| %u | 大写字母 |
| %w | 字母和数字 |
| %x | 十六进制 |
| %z | 用0表示的字符 |
| %b | 匹配成对的字符串;语法为’%bxy’,如%b()匹配(开始,)结束的一对字符串(会匹配对应的一对) |
| %f[char-set] | 匹配后一个字母在[char-set]内而前一个字母不在[char-set]内的字符,
如:%f[%w] 匹配后一个字母不是数字或字母,前一个字符时数字或字母,如ab_中的b |
- 如:模式:”%d%d/%d%d/%d%d%d%d”来匹配dd/mm/yyyy
| 字符分类及其对应 | |
| —- | —- |
| . | 所有字符 |
| %a | 字母 |
| %c | 控制符 |
| %d | 数字 |
| %g | 除空格外的可打印字符 |
| %l | 小写字母 |
| %p | 标点符号 |
| %s | 空格符号 |
| %u | 大写字母 |
| %w | 字母和数字 |
| %x | 十六进制 |
| %z | 用0表示的字符 |
| %b | 匹配成对的字符串;语法为’%bxy’,如%b()匹配(开始,)结束的一对字符串(会匹配对应的一对) |
| %f[char-set] | 匹配后一个字母在[char-set]内而前一个字母不在[char-set]内的字符,
注:这些类的大写形式表示类的补集
魔法字符内容:( ) . % + - * ? [ ] ^ $
- 使用 %魔法字符 可以在模式中匹配魔法字符
- 如:%( → ( %% → %
- 使用 %魔法字符 可以在模式中匹配魔法字符
- 在模式最后使用$表示匹配到字符串结尾
在模式开头使用^表示匹配从字符串头开始
在 [ ] 内为一个字符集,会匹配所有满足集合中的字符
- 如:[%w_] 匹配 字符、数字和_
- 如:在”1[a]b 23”中会匹配1 a b 2 3
- 如:[%w_] 匹配 字符、数字和_
- 使用 - 包含范围
- 如:[0-9] 匹配0~9之间的所有字符;[a-zA-F] 匹配a~z和A-F的所有字符
在字符前使用 ^ 来取得对应的补集(只有在字符集中有此作用)
如:%a+ 代表匹配一个或多个字母(一个单词);%d+ 代表匹配一个或多个数字(一个整数) | 修饰符 | | | —- | —- | | + | 重复一次或多次 | | | 重复零次或多次;(最长匹配);**匹配可选的空格’%(%s%)’匹配()或( ) | | - | 重复零次或多次(最小匹配);如:[%a][%w]-中的[_%w]-总是会匹配空序列**, | | ? | 可选(出现零次或一次);如:[+-]? 代表+-是可选的 |
捕获机制:()的使用
根据一个模式从目标字符串中抽出与该模式匹配的内容,通过模式中将需要捕获的部分放到一对()中指定捕获
pair = "name = Anna"
key, value = string.match(pair, "(%a+)%s*=%s(%a+)")
--模式匹配了name = Anna,但由于使用了()只捕获了()中的内容
print(key, value)
%n的使用(n为数字)
%n:重复第n个捕获到的内容
发生替换时,%n同样代表着第n个捕获到的内容
空的()→空白捕获 有其特殊含义:捕获模式在目标字符串中的位置
- 在之前是开始位置,在之后是后一个位置
- 如:”12345”中,string.match(str, “()1”)输出1;string.match(str, “5()”)输出6
- 在之前是开始位置,在之后是后一个位置
替换(gsub的第三个参数)
gsub的第三个参数可以为表
- 替换时,会先捕获匹配的内容,然后将捕获的内容对应表中的键值对进行替换,如果该键值对为nil则不替换
str = "$world name is $hello $mark" t = {world = "My", hello = "yxf"} print(string.gsub(str, "$(%w+)", t)) --匹配搜索$开头的字母,并用t中的键值对进行替换 --输出:My name is yxf $mark 3
- 替换时,会先捕获匹配的内容,然后将捕获的内容对应表中的键值对进行替换,如果该键值对为nil则不替换
gsub的第三个参数可以为函数
string.gsub(s,”^%s(.-)%s$”,”%1”)
实现split(str,separator)
string.format(“([^%s]+)”, separator)