第4章 字符串与模式匹配:文本即接口


文档摘要

第 4 章 · 字符串与模式匹配:文本即接口 章节摘要:脚本与世界打交道的另一半语言是文本——配置、日志、协议、URL 全是字符串。本章两节:4.1 讲字符串的表示(三种引定界)、不可变与驻留的实现代价与红利、string 库的核心操作与拼接的性能纪律;4.2 讲 Lua 自成一派的模式匹配——不追求正则的完整,用几百行实现换来 90% 的文本处理能力。学完本章,你手里的 Lua 能处理进来的任何文本、也能把结果漂亮地吐出去。 学习目标 阅读完本章,你应当能够: 熟练选用单双引号与长括号三种定界写法,解释转义序列与等号分级的用途; 说清字符串不可变与驻留的机制,理解"修改必造新串"对拼接性能的影响,掌握 table.concat 的正确用法;

第 4 章 · 字符串与模式匹配:文本即接口

章节摘要:脚本与世界打交道的另一半语言是文本——配置、日志、协议、URL 全是字符串。本章两节:4.1 讲字符串的表示(三种引定界)、不可变与驻留的实现代价与红利、string 库的核心操作与拼接的性能纪律;4.2 讲 Lua 自成一派的模式匹配——不追求正则的完整,用几百行实现换来 90% 的文本处理能力。学完本章,你手里的 Lua 能处理进来的任何文本、也能把结果漂亮地吐出去。

学习目标

阅读完本章,你应当能够:

  1. 熟练选用单双引号与长括号三种定界写法,解释转义序列与等号分级的用途;
  2. 说清字符串不可变与驻留的机制,理解"修改必造新串"对拼接性能的影响,掌握 table.concat 的正确用法;
  3. 使用 string 库的常用函数(sub、rep、format、byte/char、find、match、gsub、gmatch)解决日常文本问题;
  4. 书写 Lua 模式:字符类、量词(星加减问号)、锚点、捕获与位置捕获、平衡匹配与边界匹配;
  5. 用 gsub 的三种替换形式(串、函数、表)与 gmatch 迭代解决日志解析、格式转换、脱敏等现场问题;
  6. 从寄宿视角解释"为什么 Lua 不用完整正则"——实现体积、沙箱安全与性能预算的三角取舍。

核心概念速览

文本是脚本世界的通用接口:进来是字符串,出去也是字符串,中间全靠模式匹配开路。

子章节导航

4.1 字符串的表示与常用操作

从"字符串是字节序列不是字符序列"这个底层事实出发,过一遍三种定界与转义,然后进入实现视角:驻留池让相同文本共享一份内存、比较是引用级;不可变让"修改"永远是新串,循环拼接的性能雪崩由此而来。string 库按"取段、变换、格式化、查探"四组过完,数值与字符串的互转礼仪一并收进本节。

4.2 模式匹配:自成一派的文本武器

Lua 模式与正则同源不同种:字符类用百分号家族、量词只有四个、捕获用圆括号。本节从"为什么不用完整正则"的设计问题讲起,把语法表过一遍后进入实战——日志解析、头部提取、脱敏替换、格式互转,gsub 的函数替换与表替换两个高阶形态各配完整例子。

子章节之间的逻辑关系

一句话论点:4.1 解决"字符串是什么、怎么变",4.2 解决"怎么从文本里挖结构"——前者是材料学,后者是加工术。

4.1 材料学:定界 · 不可变与驻留 · 库函数四组 · concat 纪律 │ ▼ 4.2 加工术:模式语法 · 捕获 · 替换三形态 · 现场案例 │ ├──→ 第 8 章 OpenResty:头与参数解析的日常 └──→ 第 8 章 Redis:脚本返回 RESP 文本

三个先修问题

字符串按字节处理意味着什么? # 数的是字节数、sub 切的是字节区间、"包含三个汉字"的串长度是九——按字符处理要上 utf8 库。协议、URL、Base64 这些"纯字节"场景则完全不受影响,反而因为零隐式转换而可靠。

不可变的三份红利与一份代价分别是什么? 红利:比较与哈希近引用级(驻留)、键的哈希稳定、多处引用零拷贝;代价:任何"修改"都是新串,循环拼接是平方级灾难——table.concat 纪律由此而来。

模式匹配与正则的核心差异? 没有回溯(线性时间、不怕恶意输入)、没有交替与断言(表达能力换安全与体积)、语法一页可背。网关与数据库敢把模式匹配暴露给用户输入,靠的就是"不会失控"这条。

前置知识与后续延伸

  • 前置:第 1 章的 number 整浮之分(format 的格式符依赖它)、第 3 章的 table.concat 与边界(拼接的正确姿势在表侧)。
  • 为后续铺垫:第 8 章网关现场的 URL 改写、日志裁剪、头部解析全是本章内容的现场重演;模式匹配也常用于配置文件解析,与第 6 章的模块加载互为补充。

本章心法

三句话带走本章:

第一句:文本是字节,语义是人赋的。# 数字节、sub 切字节;按字符处理要过 utf8 库的翻译(offset 与 codes),协议与编码场景则享受零隐式转换的可靠。

**第二句:修改即新建,拼接讲纪律。**不可变换来的驻留与引用级比较是白赚的,循环里 s = s .. x 是要还的债——缓冲表加 concat 是唯一正解。

**第三句:模式是工具不是信仰。**线性时间、一页语法、线性安全是它的三张牌;没有交替与断言是它的边界——拿分步策略与白名单补齐,补不齐时坦然上 C 库。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U