语法
java.util.regex
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
pattern.matcher("010-12345678").matches(); // true
pattern.matcher("021-123456").matches(); // false
pattern.matcher("022#1234567").matches(); // false
// 获得Matcher对象:
Matcher matcher = pattern.matcher("010-12345678");
if (matcher.matches()) {
String whole = matcher.group(0); // "010-12345678", 0表示匹配的整个字符串
String area = matcher.group(1); // "010", 1表示匹配的第1个子串
String tel = matcher.group(2); // "12345678", 2表示匹配的第2个子串
System.out.println(area);
System.out.println(tel);
}
}
}
贪婪匹配和非贪婪匹配
- 正则默认的是贪婪匹配,会尽可能多的向后匹配
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d+)(0*)");
Matcher matcher = pattern.matcher("1230000");
if (matcher.matches()) {
System.out.println("group1=" + matcher.group(1)); // "1230000"
System.out.println("group2=" + matcher.group(2)); // ""
}
}
}
- 在规则后面加上 ? 就会变成非贪婪匹配,尽可能少的匹配
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d+?)(0*)");
Matcher matcher = pattern.matcher("1230000");
if (matcher.matches()) {
System.out.println("group1=" + matcher.group(1)); // "123"
System.out.println("group2=" + matcher.group(2)); // "0000"
}
}
}
匹配字符串
-
先用正则表达式字符串构建一个Pattern对象,构建时可以设置一个或多个标志位
-
获取Matcher对象,通过matchers()方法判断是否匹配成功
找出多个匹配
- 通过Matcher的find()方法来查找下一个匹配的子串
- 通过start() end()来获取字串的下标
- 也可以通过不带参数的group()来获取字串
- 优雅的方式,通过results()方法获得一个Stream
用分隔符来分割
替换匹配