Java中正则处理核心是先编译Pattern再用Matcher匹配:compile()预编译提升效率,find()找子串、matches()全匹配、lookingAt()前缀匹配;捕获组用group()提取,replaceAll()可直接替换;注意DOTALL、懒惰匹配.*?等技巧。

Java 中用 Pattern 和 Matcher 做复杂文本提取与查找,核心是“先编译正则、再匹配执行”,关键在写对正则表达式、选对匹配方法、正确取结果。
构建 Pattern 对象:预编译提升效率
正则表达式字符串需先通过 Pattern.compile() 编译成 Pattern 实例。重复使用同一规则时,编译一次复用多次,避免反复解析开销。
- 基础写法:
Pattern pattern = Pattern.compile("\d{3}-\d{4}");(匹配如123-4567) - 支持标志位,比如忽略大小写:
Pattern.compile("hello", Pattern.CASE_INSENSITIVE) - 若正则来自用户输入或配置,建议加
try-catch捕获PatternSyntaxException
创建 Matcher 并执行不同匹配模式
Pattern.matcher(input) 返回 Matcher,它不直接返回结果,而是提供多种匹配行为:
-
find():从当前位置向后找**任意位置的子串匹配**(最常用) -
matches():要求**整个输入字符串完全匹配**正则(等价于^...$包裹) -
lookingAt():只匹配**从开头开始的前缀**,不要求覆盖全文 - 多次调用
find()可遍历所有匹配项,每次移动内部指针
提取匹配内容:分组、捕获与替换
带括号 () 的正则会形成捕获组,用 group(int) 提取:
立即学习“Java免费学习笔记(深入)”;
-
group(0)是整个匹配文本;group(1)是第一个()内容 - 例如匹配邮箱:
Pattern.compile("(\w+)@(\w+\.\w+)"),可分别取用户名和域名 -
groupCount()返回捕获组数量,避免越界访问 - 用
replaceAll()或replaceFirst()直接替换匹配内容(内部自动创建 Matcher)
处理常见场景的小技巧
实际提取常遇到边界、贪婪、多行等问题:
- 点号
.默认不匹配换行符,需加Pattern.DOTALL标志 - 默认贪婪匹配(如
.*吃掉最多),改用懒惰写法.*?更可控 - 提取多个同类结构(如所有 URL):循环调用
find()+group() - 想同时获取匹配位置:用
start()和end()方法


















