HoRain云小助手个人主页 个人专栏: 《Linux 系列教程》《c语言教程》⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。专栏介绍专栏名称专栏介绍《C语言》本专栏主要撰写C干货内容和编程技巧让大家从底层了解C把更多的知识由抽象到简单通俗易懂。《网络协议》本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘一起解密网络协议在运行中协议的基本运行机制《docker容器精解篇》全面深入解析 docker 容器从基础到进阶涵盖原理、操作、实践案例助您精通 docker。《linux系列》本专栏主要撰写Linux干货内容从基础到进阶知识由抽象到简单通俗易懂帮你从新手小白到扫地僧。《python 系列》本专栏着重撰写Python相关的干货内容与编程技巧助力大家从底层去认识Python将更多复杂的知识由抽象转化为简单易懂的内容。《试题库》本专栏主要是发布一些考试和练习题库涵盖软考、HCIE、HRCE、CCNA等目录⛳️ 推荐专栏介绍 核心类与基础匹配 正则表达式语法详解⚙️ 进阶特性与应用 性能优化与最佳实践 常见应用场景示例掌握Java正则表达式能让你在处理文本数据时事半功倍。下面这份指南将带你从基础语法一步步走向进阶实战并附上性能优化技巧和实用案例。 核心类与基础匹配在Java中使用正则表达式主要依赖java.util.regex包中的两个核心类Pattern 和Matcher 。Pattern 是正则表达式的编译表示。通过Pattern.compile()方法将字符串形式的正则表达式编译成一个Pattern对象这样可以提高效率尤其是在多次使用同一模式时 。Matcher 是对输入字符串进行解释和匹配操作的引擎。通过Pattern.matcher(String input)方法获得Matcher对象然后利用它进行各种匹配操作 。基础匹配操作示例 import java.util.regex.Pattern; import java.util.regex.Matcher; public class BasicMatch { public static void main(String[] args) { String text The price is 123 dollars.; Pattern pattern Pattern.compile(\\d); // 匹配一个或多个数字 Matcher matcher pattern.matcher(text); while (matcher.find()) { // 循环查找所有匹配项 System.out.println(Found number: matcher.group()); // 输出: Found number: 123 } } } 正则表达式语法详解要写出高效的正则表达式需要理解其核心语法元件。1. 字符匹配普通字符如字母、数字匹配自身 。元字符具有特殊含义的字符如.匹配任意单字符、^匹配行首、$匹配行尾等。如果需要匹配元字符本身需要使用反斜杠\ 进行转义例如\. 来匹配点号 。预定义字符类提供了一些便捷的预设如\d数字[0-9]、\w单词字符[a-zA-Z0-9_]、\s空白字符以及其大写形式表示相反含义如\D匹配非数字。2. 量词与模式量词用于指定其前面字符或分组的出现次数 。tabletheadtrth量词/thth含义/thth示例/thth匹配结果/th/tr/theadtbodytrtdX?/tdtd0次或1次/tdtda?对aab/tdtda, a, (匹配b前的空)/td/trtrtdX*/tdtd0次或多次/tdtda*b对aaab/tdtdaaab/td/trtrtdX/tdtd1次或多次/tdtdab对aaab/tdtdaaab/td/trtrtdX{n}/tdtd恰好n次/tdtda{2}对aab/tdtda, a (在位置0和1)/td/trtrtdX{n,}/tdtd至少n次/tdtda{2,}对aaab/tdtdaaa/td/trtrtdX{n,m}/tdtdn到m次/tdtda{1,2}对aaab/tdtdaa, a/td/tr/tbody/table量词默认是贪婪模式会尽可能多地匹配字符。在量词后加?可启用非贪婪模式或叫懒惰模式它会尽可能少地匹配字符 。String text aaaab; Pattern greedy Pattern.compile(ab); // 贪婪模式 Pattern reluctant Pattern.compile(a?b); // 非贪婪模式 System.out.println(greedy.matcher(text).group()); // 匹配整个 aaaab System.out.println(reluctant.matcher(text).group()); // 匹配 aaaab 中的 ab尽可能少地匹配a3. 字符集与边界字符集使用方括号[]定义匹配其中任意一个字符。例如[abc]匹配 a, b 或 c。[^abc]表示否定匹配不在括号内的任何字符。还可以指定范围如[a-zA-Z]。边界匹配器^行首、$行尾、\b单词边界等用于指定匹配发生的位置 。⚙️ 进阶特性与应用1. 分组与引用圆括号()不仅可以将多个字符组合成一个单元以便使用量词还能形成捕获组。捕获组匹配的文本可以被后续引用 。后向引用在正则表达式内部使用\nn为组号来引用前面第n个捕获组匹配的文本 。// 检查字符串的首尾字符是否相同 String regex (.).*\\1; // (.) 捕获第一个字符\\1 引用该捕获组 System.out.println(abcda.matches(regex)); // true首尾都是 a System.out.println(abcd.matches(regex)); // false首 a 尾 d非捕获组如果只需要分组而不需要捕获可以使用(?:...)语法这有助于提升性能 。2. 零宽断言前瞻与后顾断言用于指定一个位置必须满足的条件但不消耗字符。正向前瞻(?...)断言当前位置后面必须匹配...。负向前瞻(?!...)断言当前位置后面必须不匹配...。正向后顾(?...)断言当前位置前面必须匹配...。负向后顾(?!...)断言当前位置前面必须不匹配...。// 匹配后面跟着元的数字但不包含元 String text 苹果5元香蕉3元; Pattern pattern Pattern.compile(\\d(?元)); Matcher matcher pattern.matcher(text); while (matcher.find()) { System.out.println(价格: matcher.group()); // 输出 价格: 5, 价格: 3 } 性能优化与最佳实践预编译正则表达式这是最重要的优化措施。如果某个正则表达式会频繁使用务必使用Pattern.compile()将其编译成Pattern对象并缓存起来避免每次调用String.matches()等方法时重新编译 。谨慎使用贪婪量词贪婪匹配可能导致大量回溯尤其是在匹配长字符串时。在不确定的情况下考虑使用非贪婪量词 。优化表达式结构尽量使用非捕获组(?:...)替代捕获组(...)除非你需要引用匹配的文本 。将最可能匹配成功的分支放在多选结构|的前面 。尽量使用预定义字符类如\d和字符集如[abc]它们通常比复杂的交替结构更高效 。明确匹配范围尽量避免过度使用通配符.明确指定字符范围可以提高匹配效率和准确性 。 常见应用场景示例1. 验证电子邮件格式 public static boolean isValidEmail(String email) { // 这是一个相对通用的简化模式实际应用可能需要调整 String emailRegex ^[a-zA-Z0-9_*-](?:\\.[a-zA-Z0-9_*-])*(?:[a-zA-Z0-9-]\\.)[a-zA-Z]{2,7}$; Pattern pattern Pattern.compile(emailRegex); return pattern.matcher(email).matches(); }2. 提取字符串中的数字 String text 订单号ORD-12345金额567.89; Pattern pattern Pattern.compile(\\d(\\.\\d)?); // 匹配整数或小数 Matcher matcher pattern.matcher(text); while (matcher.find()) { System.out.println(找到数字: matcher.group()); // 输出 找到数字: 12345, 找到数字: 567.89 }3. 替换敏感词 String text 这是一句包含不良词语和另一个不良词语的话。; String sensitiveRegex (不良词语|另一个不良词语); String filteredText text.replaceAll(sensitiveRegex, ***); System.out.println(filteredText); // 输出 这是一句包含***和***的话。希望这份指南能帮助你构建起Java正则表达式的知识体系正则表达式是一门实践性很强的技能多在具体场景中练习和调试你会越来越熟练。如果在学习过程中遇到具体问题欢迎随时提出。❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧