Java 正则表达式
正则表达式用一套“模式字符”描述字符串规则,用于校验手机号、邮箱,提取、替换和拆分文本。Java 用 Pattern 与 Matcher 两个类支持正则。
作用与使用流程
三步流程:用 Pattern.compile() 编译正则;调用 matcher() 得到 Matcher;再调用匹配方法。Java 字符串里的反斜杠要写成两个,如数字用 "\d"。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+"); // 一个或多个数字
Matcher m = p.matcher("abc123");
System.out.println(m.find()); // 输出:true(找到了数字)
}
}
matches / lookingAt / find
三个匹配方法的区别:matches() 要求整个字符串完全匹配;lookingAt() 只要求从开头匹配;find() 在任意位置查找子串。
import java.util.regex.Pattern;
public class MatchDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
System.out.println(p.matcher("123abc").matches()); // 输出:false(整串非纯数字)
System.out.println(p.matcher("123abc").lookingAt()); // 输出:true(开头是数字)
System.out.println(p.matcher("123abc").find()); // 输出:true(包含数字)
}
}
分组 group
用括号 (...) 圈住的部分是分组,m.group(1)、m.group(2) 依次取各分组,group(0) 是整个匹配:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GroupDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = p.matcher("生日 2024-11-16 好");
if (m.find()) {
System.out.println(m.group(0)); // 输出:2024-11-16
System.out.println(m.group(1)); // 输出:2024(年)
System.out.println(m.group(3)); // 输出:16(日)
}
}
}
常用元字符
| 元字符 | 含义 | 元字符 | 含义 |
|---|---|---|---|
| \d | 数字,等价 [0-9] | \w | 字母数字下划线 |
| \s | 空白字符 | . | 除换行外任意字符 |
| * | 前一项 0 次或多次 | + | 前一项 1 次或多次 |
| ? | 前一项 0 次或 1 次 | {n,m} | 重复 n 到 m 次 |
| [abc] | a、b、c 中任一 | ^ 与 $ | 开头 / 结尾 |
配合 replaceAll 与 split
String 的 replaceAll(regex, replacement) 和 split(regex) 直接支持正则,无需显式 Pattern:
public class StringRegexDemo {
public static void main(String[] args) {
String s = "abc123def456";
System.out.println(s.replaceAll("\\d+", "#")); // 输出:abc#def#
System.out.println(s.split("\\d+").length); // 输出:2(按数字切开)
}
}
贪婪与懒惰
默认贪婪匹配:尽可能多匹配;在量词后加 ? 变懒惰(勉强)匹配:能少就少。
public class GreedyDemo {
public static void main(String[] args) {
String s = "<a>1</a><b>2</b>";
System.out.println(s.replaceAll("<.*>", "#")); // 贪婪:输出:#
System.out.println(s.replaceAll("<.*?>", "#")); // 懒惰:输出:#1##2#
}
}
小结:Java 用 Pattern/Matcher 做正则匹配,matches 全串匹配、find 找子串、group 取分组;字符串里反斜杠要双写,注意贪婪与懒惰的区别。