正则表达式
概念:1、正则表达式是对字符串操作的一种逻辑公式,使用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
总结:
- 正则表达式本质还是一个字符串
- 不仅可以表示一个普通的字符串,而且还可以用来表示一类规则匹配其他字符串
案例:
1、写一个方法,用来验证一个字符串是否是一个合法的QQ号码?
2、标准:
(1)字符串的长度必须:5 - 11
(2)字符串必须全部都是数字
(3)字符串首字母不能为0
普通方法:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入QQ号判断:");
String s = sc.nextLine();
if (isQq(s)){
System.out.println("合法!");
}else{
System.out.println("不合法!");
}
}
//判断是不是合法的QQ号
public static boolean isQq(String str){
if (isAllNumber(str)&&isLength(str)&&isstartWith(str)){
return true;
}
return false;
}
//判断是否都为数字
public static boolean isAllNumber(String str){
for (int i = 0; i < str.length(); i++) {
if (!(str.charAt(i)>='0'&& str.charAt(i)<='9'))
return false;
}
return true;
}
//判断长度
public static boolean isLength(String str){
return str.length()>= 5 && str.length()<=11;
}
//判断首位是否为零
public static boolean isstartWith(String str){
return !str.startsWith("0");
}
利用正则表达式判断:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入QQ号判断:");
String s = sc.nextLine();
if (isQQ(s)){
System.out.println("合法!");
}else{
System.out.println("不合法!");
}
}
//正则表达式判断
public static boolean isQQ(String str){
return str.matches("[1-9][0-9]{5,11}");
}
正则表达式中的字符类
-
字符:单引号引起来 一个符号
-
字符类:
- 使用 [ ] 表示某一个单个符号
- 不管 [ ] 中定义多少个字符,都只能表示其中一个字符
- [abc]:表示其中一个字符 a或者b或者c的其中一个
- [a-z]:表示a-z之间的其中一个字符
- [a-zA-Z&_1]:表示其中一个字符
- [^a-z]:表示除了a-z之外的其中一个
使用方式
- 要判断一个字符串是否满足某个正则表达式,需要使用matches方法
举例:
String str = "[abc]";
System.out.println("b".matches(str));//true
System.out.println("c".matches(str));//true
System.out.println("ac".matches(str));//false
String st = "[0-9a-zA-Z]";
System.out.println("#".matches(st));//false
System.out.println("7".matches(st));//true
System.out.println("2bA".matches(st));//false
正则表达式中的预定义字符
**预定义字符:**用来表示一些常用字符的特殊符号
罗列:
-
. :表示所有的单个字符
-
\d :所有的数字字符 [0-9]
-
\D :所有的非数字字符 【^0-9】
-
\s :所有的空格字符
-
\S:所有的非空格字符
-
\w:表示0-9a-zA-Z_
-
\W:除了\w的其中一个字符
**注意:**虽然预定义字符可以表示很多种符号,但是都只能表示一个
String a = ".";
System.out.println("!".matches(a));//true
System.out.println("ss".matches(a));//false
String b = "\\w";
System.out.println("5".matches(b));//true
System.out.println("b".matches(b));//false
String c = "\\D";
System.out.println("5".matches(c));//false
System.out.println("c".matches(c));//true
String d = "\\s";
System.out.println(" ".matches(d));//true
System.out.println("!".matches(d));//false
String e = "\\S";
System.out.println(" ".matches(d));//false
System.out.println("!".matches(d));//true
String f = "\\w";
System.out.println("d".matches(d));//true
System.out.println("#".matches(d));//false
String g = "\\W";
System.out.println("5".matches(d));//false
System.out.println("!".matches(d));//true
数量词
-
字符类和预定义字符类都只能表示单个符号,如果需要表示多个符号,需要通过数量词 来修饰。
-
分类:
- 模糊的数量词
- 精确的数量词
-
模糊的数量词
- **X? ** :x这个字符可以出现0次或者1次 【最多出现一次】
- X+ :x这个字符出现1次或者多次 【至少出现一次】
- X* :x这个字符可以出现0次1次或者多次 【出现几次都行,也可以不出现】
-
精确的数量词
- X{n} :表示x这个字符正好出现n次
- X{n,} :表示x这个字符至少出现n次
- X{n,m} :表示x这个字符出现n-m次
-
注意:
- 修饰的数量词只能修饰前面的那一个字符
String regex = "x*[a-c]?\\d+";
System.out.println("xxac00".matches(regex));
System.out.println("aaa10".matches(regex));
System.out.println("xa".matches(regex));
System.out.println("zc1".matches(regex));
System.out.println("xxa00".matches(regex));
String r = "abc?"; //只代表c出现0次或1次
String r2 = "[abc]?"; //代表a、b、c出现1次或者0次
正则相关的三个方法
- matches(String regex):判断调用者字符串是否和定义的正则字符串匹配
String str2 = "a34b23n4m54";
String[] strs1 = str2.split("[0-9]+");
System.out.println(Arrays.toString(strs1));
//
-
split(String s):切割调用者字符串,只要调用者字符串中满足s这个规则都可以进行切割
返回值是一个字符串数组,将切割后的内容存入到字符串数组中
String str1 = "a1b1b1c1";
String[] strs = str1.split("1");
System.out.println(Arrays.toString(strs));
String str2 = "a34b23n4m54";
String[] strs1 = str2.split("[0-9]+");
System.out.println(Arrays.toString(strs1));
//[a, b, b, c]
//[a, b, n, m]
- replaceAll(String s1,String s):将满足s1的字符串全部替换成s字符串
String s3 = "a1b2c3d45f";
String s4 = s3.replaceAll("\\d","-");
System.out.println(s4);
String s5 = s3.replaceAll("\\d+","-");
System.out.println(s5);
//a-b-c-d--f
//a-b-c-d-f