目录
正则表达式
可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性
正则表达式的作用
- 作用一:校验字符串是否满足规则
- 作用二:在一段文本中查找满足要求的内容
字符类
字符类 | |
---|---|
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
预定义字符类
预定义字符类 | |
---|---|
.(点) | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
数量词
数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
Pattern 类
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
正则表达式语法
在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如 Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\。
System.out.print("\\"); // 输出为 \
System.out.print("\\\\"); // 输出为 \\
案例
案例一:验证QQ号
要求:5-10位,首位不能为零
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex_QQ {
public static boolean test1(String str) {
Pattern p = Pattern.compile("[1-9]\\d{4,9}");
Matcher matcher = p.matcher(str);
return matcher.matches();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个QQ号码");
String next = sc.next();
boolean b = test1(next);
if (b){
System.out.println("QQ号正确");
}else {
System.out.println("QQ号不正确");
}
}
}
输出结果:
案例二:验证手机号码
要求:11位,135 139 133 137 开头
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex_phone {
public static boolean test1(String str) {
Pattern p = Pattern.compile("(13)(5|9|3|7)\\d{8}");
Matcher matcher = p.matcher(str);
return matcher.matches();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个手机号码");
String next = sc.next();
boolean b = test1(next);
if (b){
System.out.println("手机号正确");
}else {
System.out.println("手机号不正确");
}
}
}
输出结果:
案例三:验证二代身份证号码
要求:前面6位:省份,市区,派出所等信息,第一位不能是0,后面5位是任意数字,7-14位年月日,后面四位: 任意数字出现3次 最后一位可以是数字也可以是大写x或者小写x
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex_phone {
public static boolean test1(String str) {
// Pattern p = Pattern.compile("[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dxX]");
Pattern p = Pattern.compile("[1-9]\\d{5}(18|19|20)\\d{2}(0\\d|10|11|12)(0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]");
Matcher matcher = p.matcher(str);
return matcher.matches();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个身份证号码");
String next = sc.next();
boolean b = test1(next);
if (b){
System.out.println("身份证号码正确");
}else {
System.out.println("身份证号码不正确");
}
}
}
输出结果: