- 参考:
Lua 5.3 参考手册 - https://www.runoob.com/manual/lua53doc/manual.html
文章目录
- 正则方法
- 匹配模式
- # 字符类
- # 模式条目
- # 模式
- # 捕获
- 词法约定
- # 转义串
- # 字符串:十进制、十六进制、Unicode 字符(UTF-8)
- # 数字常量
正则方法
方法名 | 参数 | 返回值 | 作用 |
string.find (s, pattern [, init [, plain]]) | s: string 字符串 pattern: string 表达式 init: number 起始位置 plain: boolean 是否使用正则 | 1. number 匹配起始位置 2. number匹配结束位置 | 字符串查找 |
string.gsub (s, pattern, repl [, n]) | s: string 字符串 pattern: string 表达式 repl: string 替换值 n: number 替换前n个 | 1. string 替换结果 2. number 替换个数 | 全局字符串替换 |
string.gmatch (s, pattern) | s: string 字符串 pattern: string 表达式 | 迭代函数: 1. w string 匹配的字符串 | 返回查找到字符串的迭代器 e.g.
|
匹配模式
Lua 中的匹配模式直接用常规的字符串来描述。 它用于模式匹配函数 string.find, string.gmatch, string.gsub, string.match。 这一节表述了这些字符串的语法及含义(即它能匹配到什么)。
# 字符类
字符类用于表示一个字符集合。 下列组合可用于字符类:
-
x
: (这里 x 不能是 魔法字符^$()%.[]*+-?
中的一员) 表示字符 x 自身。 -
.
: (一个点)可表示任何字符。 -
%a
: 表示任何字母。 -
%c
: 表示任何控制字符。 -
%d
: 表示任何数字。 -
%g
: 表示任何除空白符外的可打印字符。 -
%l
: 表示所有小写字母。 -
%p
: 表示所有标点符号。 -
%s
: 表示所有空白字符。 -
%u
: 表示所有大写字母。 -
%w
: 表示所有字母及数字。 -
%x
: 表示所有 16 进制数字符号。 -
%x
: (这里的 x 是任意非字母或数字的字符) 表示字符 x。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个 ‘%’ 放在模式串中表示自身。 -
[set]
: 表示 set 中所有字符的联合。 可以以 ‘-’ 连接,升序书写范围两端的字符来表示一个范围的字符集。 上面提到的%x
形式也可以在 set 中使用 表示其中的一个元素。 其它出现在 set 中的字符则代表它们自己。
例如,[%w_]
(或[_%w]
) 表示所有的字母数字加下划线),[0-7]
表示 0 ~7 数字,[0-7%l%-]
表示 0 ~ 7 数字加小写字母与 ‘-
’ 字符。
交叉使用类和范围的行为未定义。 因此,像
[%a-z]
或[a-%%]
这样的模式串没有意义。
-
[^set]
: 表示 set 的补集, 其中 set 如上面的解释。
所有单个字母表示的类别(%a,%c,等), 若将其字母改为大写,均表示对应的补集。 例如,%S 表示所有非空格的字符。
如何定义字母、空格、或是其他字符组取决于当前的区域设置。 特别注意:[a-z] 未必等价于 %l 。
# 模式条目
模式条目 可以是
- 单个字符类匹配该类别中任意单个字符;
- 单个字符类跟一个 ‘
*
’, 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串; - 单个字符类跟一个 ‘
+
’, 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串; - 单个字符类跟一个 ‘
-
’, 将匹配零或更多个该类的字符。 和 ‘*
’ 不同, 这个条目总是匹配尽可能短的串; - 单个字符类跟一个 ‘
?
’, 将匹配零或一个该类的字符。 只要有可能,它会匹配一个; -
%n
, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。 -
%bxy
, 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b() 可以匹配到括号平衡的表达式。 -
%f[set]
, 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 ‘\0’ 一样。
# 模式
模式 指一个模式条目的序列。 在模式最前面加上符号 ‘^
’ 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 ‘$
’ 将使匹配过程锚定到字符串的结尾。 如果 ‘^
’ 和 '
$’ 出现在其它位置,它们均没有特殊含义,只表示自身。
# 捕获
模式可以在内部用小括号 (...)
括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。
例如,对于模式 “(a*(.)%w(%s*))
” :
- 字符串中匹配到 “
a*(.)%w(%s*)
” 的部分保存在第一个捕获物中 (因此是编号 1 ); - 由 “
.
” 匹配到的字符是 2 号捕获物; - 匹配到 “
%s
*” 的那部分是 3 号;
作为一个特例,空的捕获 ()
将捕获到当前字符串的位置(它是一个数字)。
例如,如果将模式 “()aa()
” 作用到字符串 “flaaap” 上,将产生两个捕获物: 3 和 5 。
词法约定
# 转义串
- ‘
\a
’ (响铃) - ‘
\b
’ (退格) - ‘
\f
’ (换页) - ‘
\n
’ (换行) - ‘
\r
’ (回车) - ‘
\t
’ (横项制表) - ‘
\v
’ (纵向制表) - ‘
\\
’ (反斜杠) - ‘
\"
’ (双引号) - ‘
\'
’ (单引号) - ‘
\z
’ 会忽略其后的一系列空白符,包括换行; 它在你需要对一个很长的字符串常量断行为多行并希望在每个新行保持缩进时非常有用。
# 字符串:十进制、十六进制、Unicode 字符(UTF-8)
十六进制: \xXX
(XX 必须是恰好两个字符的 16 进制数)
十进制: \ddd
(一到三个十进制数字)(注意,如果在转义符后接着恰巧是一个数字符号的话, 你就必须在这个转义形式中写满三个数字。)
对于用 UTF-8 编码的 Unicode 字符,你可以用 转义符 \u{XXX}
来表示 (这里必须有一对花括号), 此处的 XXX 是用 16 进制表示的字符编号。
# 数字常量
数字常量 (或称为 数字量) 可以由可选的小数部分和可选的十为底的指数部分构成, 指数部分用字符 ‘e’ 或 ‘E’ 来标记。 Lua 也接受以 0x 或 0X 开头的 16 进制常量。 16 进制常量也接受小数加指数部分的形式,指数部分是以二为底, 用字符 ‘p’ 或 ‘P’ 来标记。 数字常量中包含小数点或指数部分时,被认为是一个浮点数; 否则被认为是一个整数。 下面有一些合法的整数常量的例子:
3 345 0xff 0xBEBADA
以下为合法的浮点常量:
3.0 3.1416 314.16e-2 0.31416E1 34e1
0x0.1E 0xA23p-4 0X1.921FB54442D18P+1