Java 正则表达式
Pattern/Matcher 的用法、捕获组、正则语法与常用方法。
java.util.regex 包
Two core classes: Pattern is the compiled regex and Matcher performs matching on a specific string. For simple cases use String.matches, split or replaceAll directly.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Basic {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("abc123def456");
System.out.println(m.find());
System.out.println(m.group());
System.out.println("123".matches("\\d+"));
System.out.println("abc123".matches("\\d+"));
}
}true
123
true
false捕获组
Parentheses create capture groups; group(1), group(2) follow the order of opening brackets, and group(0) is the whole match. Named groups use (?<name>...) read via group("name").
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Groups {
public static void main(String[] args) {
Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = p.matcher("date: 2024-10-31");
if (m.find()) {
System.out.println(m.group(0));
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.groupCount());
}
}
}2024-10-31
2024
10
3正则表达式语法
The grammar matches other languages: . any character, \d digit, \w word char, \s whitespace, * + ? quantifiers, {m,n} counts, [] sets, ^ $ anchors, | alternation. In Java, backslashes are doubled.
public class Syntax {
public static void main(String[] args) {
System.out.println("a1".matches("[a-z]\\d"));
System.out.println("abc".matches("a.c"));
System.out.println("12345".matches("\\d{3,5}"));
System.out.println("2024".matches("^(19|20)\\d{2}$"));
System.out.println("a@b.com".matches("\\w+@\\w+\\.\\w+"));
}
}true
true
true
true
trueMatcher 常用方法
matches() requires the whole string, find() looks for the next match, lookingAt() matches from the start, replaceAll / replaceFirst substitute, group() returns the text. Loop on find to walk every match.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("a1b22c333");
int count = 0;
while (m.find()) {
count++;
System.out.print(m.group() + " ");
}
System.out.println();
System.out.println(count);
System.out.println("a1b22".replaceAll("\\d+", "#"));
System.out.println(p.matcher("a1b22").replaceFirst("*"));
}
}1 22 333
3
a#b#
a*b22java.util.regex 包
核心是两个类:Pattern 表示编译后的正则,Matcher 表示在某个字符串上的匹配操作。简单场景也可以直接用 String.matches / split / replaceAll。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Basic {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("abc123def456");
System.out.println(m.find());
System.out.println(m.group());
System.out.println("123".matches("\\d+"));
System.out.println("abc123".matches("\\d+"));
}
}true
123
true
false捕获组
用圆括号把模式分段就是捕获组,group(1)、group(2) 按左括号顺序取。group(0) 是整段匹配。命名组写作 (?<name>...),用 group("name") 取。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Groups {
public static void main(String[] args) {
Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = p.matcher("date: 2024-10-31");
if (m.find()) {
System.out.println(m.group(0));
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.groupCount());
}
}
}2024-10-31
2024
10
3正则表达式语法
常用语法与其它语言一致:. 任意字符、\d 数字、\w 单词字符、\s 空白、* + ? 量词、{m,n} 次数、[] 字符集、^ $ 锚点、| 或。Java 里反斜杠要写两个。
public class Syntax {
public static void main(String[] args) {
System.out.println("a1".matches("[a-z]\\d"));
System.out.println("abc".matches("a.c"));
System.out.println("12345".matches("\\d{3,5}"));
System.out.println("2024".matches("^(19|20)\\d{2}$"));
System.out.println("a@b.com".matches("\\w+@\\w+\\.\\w+"));
}
}true
true
true
true
trueMatcher 常用方法
matches() 要求整串匹配、find() 找下一个匹配、lookingAt() 从开头匹配、replaceAll / replaceFirst 替换、group() 取内容。find 循环可遍历所有匹配。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("a1b22c333");
int count = 0;
while (m.find()) {
count++;
System.out.print(m.group() + " ");
}
System.out.println();
System.out.println(count);
System.out.println("a1b22".replaceAll("\\d+", "#"));
System.out.println(p.matcher("a1b22").replaceFirst("*"));
}
}1 22 333
3
a#b#
a*b22