正则表达式就是描述字符串的规则。jdk 内置正则表达式引擎:java.util.regex
1. 示例判断用户输入的年份是否是 19xx 年
写法一:
package cn.itcast.order.pojo;
public class Demo {
public static void main(String[] args) {
String input = "1990";
boolean is19xx = input.matches("19\d\d");
System.out.println(is19xx);
}
}
写法二:
package cn.itcast.order.pojo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo {
static Pattern pattern = Pattern.compile("19\d\d");
public static void main(String[] args) {
Matcher matcher = pattern.matcher("1990");
boolean matches = matcher.matches();
System.out.println(matches);
}
}
写法二把正则表达式编译为 Pattern 对象,适用于反复使用这个正则表达式的情形
2. 基本匹配规则| Java 字符串正则表达式 | 可以匹配的字符串 | 说明 |
|---|---|---|
| “abc” | “abc” | 精确匹配 |
| “a\&c” | “a&c” | 精确匹配,特殊字符需要转义。有一些字符不需要转义,但是加上也没有错 |
| “a.c” | “abc” “a&c” | 符号 . 来匹配一个任意字符 |
| “00\d” | "007" “008” | 符号 d 可以匹配一个数字 |
| “00\D” | “00A” “00#” | 符号 D 可以匹配一个非数字 |
| “java\w” | “javac” "java8" “java_” | 符号 w 可以匹配一个字母、数字或下划线 |
| “java\W” | “java!” "java " | 符号 W 可以匹配一个非字母、数字或下划线 |
| “A\sB” | “A B” “A B” | 符号 s 可以匹配一个空白字符(tab 键也算一个空白字符) |
| “A\SB” | "A&B" ABB | 符号 S 可以匹配一个非空白字符 |
| “A\d*” | “A” "A1" A007 | 修饰符 * 可以匹配任意个字符,在这里 * 修饰的是 d |
| “A\d+” | "A1" “A007” | 修饰符 + 可以匹配至少一个字符,在这里 + 修饰的是 d |
| “A\d?” | “A” “A1” | 修饰符 ? 可以匹配 0 个或 1 个字符,在这里 ? 修饰的是 d |
| “\d{6}” | "123456" “999999” | 修饰符 {n} 可以匹配 n 个字符,在这里 {6} 修饰的是 d |
| “\d{3,5}” | "123" “12345” | 修饰符 {n,m} 可以匹配 n-m 个字符,在这里 {3,5} 修饰的是 d |
| “\d{3,}” | "123" "1234" “123456789” | 修饰符 {n,} 可以匹配至少 n 个字符,在这里 {3,} 修饰的是 d |
3. 复杂匹配规则注意:
Java 字符串的正则表达式要多加一个 ,因为 也要转义正则表达式符号的大写与小写所代表的含义是相反的
| Java 字符串正则表达式 | 可以匹配的字符串 | 说明 |
|---|---|---|
| “^A\d{3}$” | "A001" “A999” | 用 ^ 和 $ 表示正则表达式的开头和结尾。在 Java 中这两个字符可以加,也可以不加 |
| “[abc]1” | "a1" "b1" “c1” | […] 可以匹配在这个范围内的一个字符 |
| “[a-f]1” | "a1" "b1" “f1” | 同上 |
| “[a-f0-9]{6}” | “1a2b3c” “ffffff” “ff0102” | 同上 |
| “[a-f0-9_]{6}” | “1a_b3c” "_fffff" “ff010_” | 同上 |
| “[^0-9]{6}” | “abcdef” "$$$$$$" “A-B-C-” | [^…] 表示可以匹配非这个范围内的字符。这里是除了 0-9 的数字都可以匹配 |
| “java|php” | “java” “php” | “AB|CD” 可以匹配 AB 或 CD |
| “learn\s(java|php)” | “learn java” “learn php” | 同上 |
我们可以通过小括号进行分组,然后提取出每组的内容
正则表达式:String regex = "^\d{3,4}\-\d{6,8}$";
上面的正则表达式只能判断给定的字符串能否匹配,但是不能提取每个部分匹配的字符串,这时候就要用小括号来进行分组匹配:String regex = "^(\d{3,4})\-(\d{6,8})$";
我们可以通过方式二的 Matcher.group(n) 来提取子串
package cn.itcast.order.pojo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo {
static Pattern pattern = Pattern.compile("^(\d{3,4})\-(\d{6,8})$");
public static void main(String[] args) {
Matcher matcher = pattern.matcher("010-12345678");
if (matcher.matches()) {
String whole = matcher.group(0); // 0 表示匹配整个字符串
String firstString = matcher.group(1); // 1 表示匹配第一个带括号的子串
String secondString = matcher.group(2); // 2 表示匹配第二个带括号的子串
System.out.println(whole); // 010-12345678
System.out.println(firstString); // 010
System.out.println(secondString); // 12345678
}
}
}
5. 非贪婪匹配
判断数字末尾 0 的个数
“123000”:3 个 0“10100”:2 个 0“1001”:0 个 0
正则表达式默认使用贪婪匹配,尽可能多的向后匹配
package cn.itcast.order.pojo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo {
static Pattern pattern = Pattern.compile("^(\d+)(0*)$");
public static void main(String[] args) {
Matcher matcher = pattern.matcher("1230000");
if (matcher.matches()) {
String firstString = matcher.group(1);
String secondString = matcher.group(2);
System.out.println(firstString); // "1230000"
System.out.println(secondString); // ""
}
}
}
我们使用 ? 实现非贪婪匹配
package cn.itcast.order.pojo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo {
static Pattern pattern = Pattern.compile("^(\d+?)(0*)$");
public static void main(String[] args) {
Matcher matcher = pattern.matcher("1230000");
if (matcher.matches()) {
String firstString = matcher.group(1);
String secondString = matcher.group(2);
System.out.println(firstString); // "123"
System.out.println(secondString); // "0000"
}
}
}
6. 利用正则表达式分割字符串为数组注意:? 既可以表示匹配 0 个或 1 个字符,也可以表示非贪婪匹配
字符串的 split 方法,将一个字符串分割为数组
package cn.itcast.order.pojo;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
String[] split1 = "a b c".split("\s");
System.out.println(Arrays.toString(split1)); // [a, b, c]
String[] split2 = "a b c".split("\s+");
System.out.println(Arrays.toString(split2)); // [a, b, c]
String[] split3 = "a, b ; ; c".split("[\,\s\;]+");
System.out.println(Arrays.toString(split3)); // [a, b, c]
}
}
private static final String regEx_script = "


