正则表达式只做匹配、提取、替换三件事,其他用途均为组合应用;常见错误源于忽略转义、贪婪性、标志位及API差异,如String.matches()是全串匹配而Pattern+Matcher才用于子串查找。

正则表达式不是“意思”,它是一个可执行的字符串匹配规则,本质是用一套紧凑语法描述“什么样的文本该被找出来、改掉或拦下来”。
正则表达式到底在干啥?看三个真实动作
它不解释、不翻译、不推理——只做三件事:匹配、提取、替换。所有其他说法(比如“验证”“清洗”“解析”)都是这三件事的组合应用。
-
匹配:判断一个字符串是否整体/局部符合规则。比如
"13812345678"是否符合手机号模式^1[3-9]\\d{9}$ -
提取:从大段文本里捞出符合条件的片段。比如从日志行
"ERROR [2026-01-09 10:23:45] User 1001 login failed"中用\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\]提取出时间 -
替换:把匹配到的部分换成别的内容。比如把所有邮箱里的 @ 符号替换成
[at],防止爬虫采集:str.replaceAll("(\\w+)@(\\w+\\.\\w+)", "$1[at]$2")
为什么写出来的正则经常“看起来对,实际不工作”?
根本原因在于:正则不是自然语言,它对字符边界、贪婪性、转义、分组捕获这些细节极其敏感。同一个需求,写法差一个字符,行为可能完全相反。
Unix in a Nutshell同时涵盖了许多重要的、业界标准的开放源码工具 本书还完整地讨论了常用的shell(bash、ksh及tcsh)和重要元素如正则表达式,乃至旧式工具如sed、awk与vi。 Unix不是一个庞大的物体:它是一个综合体,而《Unix技术手册》则是将这一切合并在一起的一本书。 到底unix是什么?原始的unix源码是由sco拥有,unix注册商标是由open group拥有,而领先的仿unix系统则是gnu/linux、mac os x及solaris。这些版本所附的命令与选
- 忘记转义:想匹配点号
.,却写了.txt—— 实际匹配任意字符 + "txt";正确写法是\\.txt - 贪婪 vs 懒惰:用
src=".*"提取 HTML 中的 src 属性,结果从第一个"一直吃到最后一个";应改用src=".*?" - 忽略大小写但没开 flag:想匹配
"HTTP"和"http",却只写http;Java 需加Pattern.CASE_INSENSITIVE,JS 要加i标志 - 中文或 Unicode 字符没处理好:
\\w在 Java 默认只匹配 ASCII 字母数字,匹配中文需显式写[\\u4e00-\\u9fa5]或启用UNICODE_CHARACTER_CLASS
Java 中最常踩坑的两个 API 用法
Java 的 String.matches() 和 Pattern.compile().matcher().find() 行为差异极大,新手几乎必错一次。
-
String.matches()是全串匹配:它自动在你写的正则前后加上^和$。写"\\d+"去匹配"abc123def"会返回false,因为整串不是纯数字 - 真正做“查找子串”要用
Pattern+Matcher:Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("abc123def456"); while (m.find()) { System.out.println(m.group()); // 输出 123, 456 } - 还有个隐形坑:
String.replaceFirst()和replace()接收的是字面量字符串,不是正则;而replaceAll()才是正则替换——名字带All和First的才是正则版
正则本身没有“难”或“易”,只有“写对了没”。多数失败不是不会,而是没意识到:它对空格、换行、转义、标志位、引擎差异(Java vs JS vs Python)都零容忍。写完别急着提交,先用在线工具(如 regex101.com)选对 flavor 看实时匹配过程。









