引言:正则表达式——文本处理的瑞士军刀
在数据清洗、日志分析、爬虫开发等场景中,正则表达式(Regex)如同程序员手中的"魔法符文",能精准定位、提取和转换文本。但面对\d+
、.*?
等神秘符号,新手往往望而生畏。本文将为你揭开正则表达式的神秘面纱,通过系统化学习路径和实战案例,助你轻松驾驭这把文本处理利器。
一、正则表达式核心思维:模式匹配的艺术
1.1 基础构建模块
-
字面量匹配:直接匹配字符本身
/cat/
→ 匹配"category"中的"cat" -
元字符(Metacharacters):特殊符号的魔法
.
匹配任意字符(除换行符)
^
匹配行首,$
匹配行尾
[]
字符集合:[aeiou]
匹配所有元音字母 -
量词(Quantifiers):控制匹配次数
*
0次或多次,+
1次或多次,?
0或1次
{3}
精确匹配3次,{2,5}
匹配2-5次
1.2 经典案例解析
邮箱验证:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
URL提取:https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&/=]*)$
二、进阶技巧:从匹配到操作的跨越
2.1 分组与捕获
-
捕获组:
()
创建子模式,可通过\1
反向引用
(Mr?s?)\. \1
匹配"Mr. Mr"或"Mrs. Mrs" -
非捕获组:
(?:pattern)
优化性能
(?:https?)://
匹配http/https协议
2.2 环视(Lookarounds)
-
肯定前瞻:
(?=pattern)
\d+(?=px)
匹配"12px"中的"12"但不包含"px" -
否定后顾:
(?<!pattern)
(?<!\$)\d+
匹配非货币数字
2.3 实战技巧
-
贪婪 vs 懒惰匹配:
<.*>
(贪婪)匹配整个HTML标签,<.*?>
(懒惰)匹配单个标签 -
Unicode支持:
\p{L}
匹配所有语言字母,\p{Han}
匹配中文字符