同一个正则,在一段日志里只找到第一处,换到多行文本又找不到,问题可能在修饰符上。宝塔拨测的“正则测试”把表达式、修饰符、匹配高亮和位置详情放在同一页,可以用一小段测试文本逐项对照。

下面用短文本分别测试 g、i、m、s。每次只保留需要的选项,先确认简单例子的结果,再把表达式用到实际数据里,便于判断差别由哪里产生。

从只找第一处开始

进入“正则测试”,表达式框只填主体 error,不要把两侧的 / 一起输入;页面已经画出了分隔斜线。测试文本填写:

error ERROR error

先把 g、i、m、s 都点到未选中状态。本次页面显示“1 个匹配”,右侧只高亮第一处小写 error,详情是 @0–5。

所有修饰符关闭时,error 只匹配第一处小写文本,详情显示位置 0 到 5
所有修饰符关闭时,error 只匹配第一处小写文本,详情显示位置 0 到 5

这段例子使用 ASCII 字符,0 是第一处匹配的起点,5 是紧接匹配末尾的位置。也就是从开头取五个字符,而不是“第零到第五个字符一共六个”。查看后续结果时,可以拿实际文字长度核对这种区间表示。

g 控制继续查找,i 控制大小写

保持表达式和测试文本不变,只打开 g,本次得到两处小写 error。继续打开 i,中间的大写 ERROR 也被匹配,结果增加到三处。

同时开启 g 和 i 后,三个 error 均高亮,详情列出 0–5、6–11、12–17 三段位置
同时开启 g 和 i 后,三个 error 均高亮,详情列出 0–5、6–11、12–17 三段位置

g 用于全局查找,i 用于忽略大小写。它们影响的条件不同:需要找齐全文里的小写词,可以只开 g;希望同一个词的大写、小写都算,再加 i。不要看到结果少就直接修改表达式,先看是不是停在第一处,或大小写没有覆盖。

匹配详情还能帮助发现“看起来匹配了整行,实际只取了一小段”的问题。把高亮文字、匹配数量和区间一起核对,比只看绿色高亮更容易确认范围。

m 影响行首行尾,不负责跨行的点号

将表达式改成 ^error$,测试文本改为三行:

error
ERROR
next

保留 g 和 i,先关闭 m 与 s。本次没有匹配;再打开 m,结果变为两处,分别是第一行和第二行。

开启 g、i、m 后,带行首行尾限制的表达式分别匹配 error 和 ERROR 两行
开启 g、i、m 后,带行首行尾限制的表达式分别匹配 error 和 ERROR 两行

^ 与 $ 在这里限定开始和结束。没有 m 时,这份三行文本整体不符合“只有 error”这个条件;打开 m 后,行首行尾的判断可以落在每一行,因此前两行分别符合。

m 不会让普通的 . 自动跨过换行。想检查一对标记之间包含多行的内容,应另看 s 的作用,不要把“多行”按钮理解成对所有跨行需求都有效。

s 让点号覆盖换行

把表达式改成 BEGIN.*END,输入:

BEGIN
line
END

这次只开 g 时没有匹配;保持其他条件不变,打开 s,本次出现一处匹配,区间为 @0–14,覆盖整段文本。

开启 g 与 s 后,BEGIN 和 END 之间的换行被点号覆盖,整段得到一处匹配
开启 g 与 s 后,BEGIN 和 END 之间的换行被点号覆盖,整段得到一处匹配

.* 表示让点号重复匹配,s 使点号也能匹配换行。这个例子只有一组开始、结束标记;真实文本如果有多组标记,还要核对是否从最前面的 BEGIN 一直取到了更后面的 END。匹配数量符合预期,也不等于每段范围都合适。

调试时可以按“主体表达式—大小写—是否找齐—行边界—点号跨行”的顺序逐步修改,同时保留一条应该匹配和一条不该匹配的短样本。迁移到其他编程语言或服务配置前,再按目标环境核对正则语法和选项,别仅凭浏览器中的一次结果认定所有环境都一致。