Java正则表达式:从理论到实践
\n正则表达式(regex)是用于文本搜索、替换和验证的强大工具。在Java中,通过java.util.regex包实现,该包包含两个主要类:Pattern(模式)和Matcher(匹配器)。本文将讲解语法、关键方法,并通过实际代码示例巩固知识。
本文既适合刚接触Java的新手,也适合希望复习知识的有经验的开发者。所有示例均可直接在您的IDE中运行。
\n\n1. Pattern和Matcher基础
\n在Java中使用正则表达式,首先通过Pattern.compile()编译模式。然后创建Matcher对象,将模式应用于字符串。
看一个最简单的示例:在文本中查找所有数字。
\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class RegexDemo {\n public static void main(String[] args) {\n String text = "Java版本21于2023年发布";\n String regex = "\\\\d+"; // 一个或多个数字\n\n Pattern pattern = Pattern.compile(regex);\n Matcher matcher = pattern.matcher(text);\n\n while (matcher.find()) {\n System.out.println("找到: " + matcher.group());\n }\n }\n}\n程序输出:
\n找到: 21\n找到: 2023\n注意双反斜杠\\\\d——在Java字符串字面量中,需要对反斜杠进行转义。如果正则表达式中需要\\d,在代码中应写为\\\\d。
2. 正则表达式语法:元字符和量词
\n要有效使用正则表达式,需要记住以下主要元字符:
\n- \n
.— 任意字符(除换行符外); \n \\\\d— 数字(等价于[0-9]); \n \\\\w— 字母、数字或下划线([a-zA-Z0-9_]); \n \\\\s— 空白字符; \n ^— 字符串开头; \n $— 字符串结尾。 \n
量词控制重复次数:
\n- \n
+— 一次或多次; \n *— 零次或多次; \n ?— 零次或一次; \n {n}— 恰好n次; \n {n,m}— 从n到m次。 \n
示例:查找所有由拉丁字母组成、长度为3到5个字符的单词。
\nString text = "Java regex example for beginners";\nString regex = "\\\\b[a-zA-Z]{3,5}\\\\b";\n\nPattern pattern = Pattern.compile(regex);\nMatcher matcher = pattern.matcher(text);\n\nwhile (matcher.find()) {\n System.out.println(matcher.group());\n}\n// 输出: Java, regex, for\n单词边界\\\\b防止部分匹配(例如,"Java"不会成为"JavaScript"的一部分)。
3. 实战示例:验证和数据提取
\n接下来看一些实际开发中常见的任务。
\n\n3.1. 验证电子邮件地址
\n最简单的检查:是否存在"@"符号和域名。
\npublic static boolean isValidEmail(String email) {\n String regex = "^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$";\n return Pattern.matches(regex, email);\n}\n\npublic static void main(String[] args) {\n System.out.println(isValidEmail("user@example.com")); // true\n System.out.println(isValidEmail("invalid-email")); // false\n}\nPattern.matches()方法自动检查整个字符串(等同于matcher.matches())。
3.2. 提取电话号码
\n假设文本中出现格式为"+7 (999) 123-45-67"的电话号码。
\nString text = "联系人: +