我学正则走过最大的弯路是背符号表。背完就忘,忘了再背,循环往复。真正的转折是三个顿悟时刻——每一个都不复杂,但它们把零散的符号串成了一个系统。
顿悟一:正则是"描述形状",不是"罗列可能"
新手爱写 (abc|abd|abe),高手写 ab[ce]。区别在于思维:别列举所有可能性,描述目标文本的形状。形状抓准了,表达式自然短。
顿悟二:贪婪是默认,懒惰要显式
<.*> 会一口气吃掉整行,<.*?> 才会在第一个 > 停下。理解"贪婪/懒惰"的那个下午,我的日志提取脚本从"经常抽风"变成了"一次到位"。
顿悟三:分组是变量
() 不只是分组,它是捕获:匹配到的内容会存进变量,替换时可以用 $1、$2 重新排列。学会了分组,"批量重命名文件"这类事从手工作业变成了单行命令。
# 交换"姓氏 名字"为"名字 姓氏"
s/(\S+) (\S+)/$2 $1/
# 提取日志里的 IP
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log
正则表达式难,不是因为它复杂,而是因为它把"你想说的话"压缩得太狠——学它的过程,其实是学着把意图展开再说一遍。
附赠一个练习建议:找一个真实任务(比如从服务器日志提取 IP),只用正则完成它。真实任务里的成就感,是任何练习册都给不了的。