第 4 章 · 字符串与模式匹配:文本即接口 章节摘要:脚本与世界打交道的另一半语言是文本——配置、日志、协议、URL 全是字符串。本章两节:4.1 讲字符串的表示(三种引定界)、不可变与驻留的实现代价与红利、string 库的核心操作与拼接的性能纪律;4.2 讲 Lua 自成一派的模式匹配——不追求正则的完整,用几百行实现换来 90% 的文本处理能力。学完本章,你手里的 Lua 能处理进来的任何文本、也能把结果漂亮地吐出去。 学习目标 阅读完本章,你应当能够: 熟练选用单双引号与长括号三种定界写法,解释转义序列与等号分级的用途; 说清字符串不可变与驻留的机制,理解"修改必造新串"对拼接性能的影响,掌握 table.concat 的正确用法;
章节摘要:脚本与世界打交道的另一半语言是文本——配置、日志、协议、URL 全是字符串。本章两节:4.1 讲字符串的表示(三种引定界)、不可变与驻留的实现代价与红利、string 库的核心操作与拼接的性能纪律;4.2 讲 Lua 自成一派的模式匹配——不追求正则的完整,用几百行实现换来 90% 的文本处理能力。学完本章,你手里的 Lua 能处理进来的任何文本、也能把结果漂亮地吐出去。
阅读完本章,你应当能够:
文本是脚本世界的通用接口:进来是字符串,出去也是字符串,中间全靠模式匹配开路。
从"字符串是字节序列不是字符序列"这个底层事实出发,过一遍三种定界与转义,然后进入实现视角:驻留池让相同文本共享一份内存、比较是引用级;不可变让"修改"永远是新串,循环拼接的性能雪崩由此而来。string 库按"取段、变换、格式化、查探"四组过完,数值与字符串的互转礼仪一并收进本节。
Lua 模式与正则同源不同种:字符类用百分号家族、量词只有四个、捕获用圆括号。本节从"为什么不用完整正则"的设计问题讲起,把语法表过一遍后进入实战——日志解析、头部提取、脱敏替换、格式互转,gsub 的函数替换与表替换两个高阶形态各配完整例子。
一句话论点:4.1 解决"字符串是什么、怎么变",4.2 解决"怎么从文本里挖结构"——前者是材料学,后者是加工术。
4.1 材料学:定界 · 不可变与驻留 · 库函数四组 · concat 纪律 │ ▼ 4.2 加工术:模式语法 · 捕获 · 替换三形态 · 现场案例 │ ├──→ 第 8 章 OpenResty:头与参数解析的日常 └──→ 第 8 章 Redis:脚本返回 RESP 文本
字符串按字节处理意味着什么? # 数的是字节数、sub 切的是字节区间、"包含三个汉字"的串长度是九——按字符处理要上 utf8 库。协议、URL、Base64 这些"纯字节"场景则完全不受影响,反而因为零隐式转换而可靠。
不可变的三份红利与一份代价分别是什么? 红利:比较与哈希近引用级(驻留)、键的哈希稳定、多处引用零拷贝;代价:任何"修改"都是新串,循环拼接是平方级灾难——table.concat 纪律由此而来。
模式匹配与正则的核心差异? 没有回溯(线性时间、不怕恶意输入)、没有交替与断言(表达能力换安全与体积)、语法一页可背。网关与数据库敢把模式匹配暴露给用户输入,靠的就是"不会失控"这条。
三句话带走本章:
第一句:文本是字节,语义是人赋的。# 数字节、sub 切字节;按字符处理要过 utf8 库的翻译(offset 与 codes),协议与编码场景则享受零隐式转换的可靠。
**第二句:修改即新建,拼接讲纪律。**不可变换来的驻留与引用级比较是白赚的,循环里 s = s .. x 是要还的债——缓冲表加 concat 是唯一正解。
**第三句:模式是工具不是信仰。**线性时间、一页语法、线性安全是它的三张牌;没有交替与断言是它的边界——拿分步策略与白名单补齐,补不齐时坦然上 C 库。