正则表达式:简单理解为符合一定规则的字符串。
(正:正确;则:规则)
一、正则表达式的常见组成规则(理解认识即可)
1.字符:
(1)x :字符x。eg:'a'表示字符a;
(2)\\:反斜线字符;
(3)\n:换行符;
(4)\r:回车符。
2.字符类:
(1)[abc]:a、b或c(仅表示其中一个)【简单类】;
(2)[^abc]:除了abc以外的任何字符【否定】;
(3)[a-zA-Z]:a到z或A到Z【范围】;
(4)[0-9]:0到9范围内的字符。
3.预定义字符类:
(1)· :任何字符;eg:如果就是表示 · 这个字符本身,表示为\.;
(2)\d:数字[0-9];
(3)\D:非数字[^0-9];
(4)\w:单词字符[a-zA-Z0-9]。
4.数量词:
(1)X?:x出现一次或者0次;
(2)X*:0次或者0次以上(多次);
(3)X+:一次或者多次;
(4)X{n}:恰好n次;
(5)X{n,m}:至少n次,但不超过m次。
注:默认的话一般表示一次。
二、正则表达式的应用
1.判断功能:public boolean matches(String regex);
String类,matches()方法
案例:校验邮箱
import java.util.Scanner;
/*
* 校验邮箱
*/
public class RegexDemo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的邮箱:");
String email = sc.nextLine();
//规则
String regex = "\\w+@\\w{2,6}\\.\\w{2,3}";
boolean flag = email.matches(regex);
System.out.println(flag);
}
}
2.分割功能:String类的public String[] split(String regex)
import java.util.Scanner;
/*
* 正则表达式的分割功能
* String类的public String[] split(String regex)
* 根据给定的正则表达式的匹配拆分此字符串
* eg:年龄给定一个范围“18-24”,问如何得到int型数字
*/
public class RegexDemo4 {
public static void main(String[] args) {
//定义一个年龄搜索范围
String ages = "18-24";
//定义规则
String regex = "-";
//调用方法
String[] strArray = ages.split(regex);
// 遍历
// for(int i = 0; i < strArray.length; i ++) {
// System.out.println(strArray[i]);
// }
//得到int类型的结果
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄:");
int age = sc.nextInt();
if(age >= startAge && age <= endAge) {
System.out.println("年龄符合要求");
}else {
System.out.println("请输入合法年龄");
}
}
}
/*
* 分割功能案例
*/
public class RegexDemo5 {
public static void main(String[] args) {
String s1 = "aa,bb,cc";
String[] str1Array = s1.split(",");
for(int i = 0; i < str1Array.length; i ++) {
System.out.println(str1Array[i]);
}
System.out.println("-----------------");
String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");
for(int i = 0; i < str2Array.length; i ++) {
System.out.println(str2Array[i]);
}
System.out.println("-------------------");
String s3 = "aa bb cc";
String[] str3Array = s3.split(" +");
for(int i = 0; i < str3Array.length; i ++) {
System.out.println(str3Array[i]);
}
System.out.println("-------------------");
//D:\Develop\Java
//我们应该用\\来代替\
String s4 = "D:\\Develop\\Java";
String[] str4Array = s4.split("\\\\");
for(int i = 0; i < str4Array.length; i ++) {
System.out.println(str4Array[i]);
}
}
}
字符型数组转换成整形,排序后再转换为字符型输出:
import java.util.Arrays;
/*
* 输入字符串“91 27 46 38 50”,
* 对其进行排序并输出字符串“27 38 46 50 91”。
*/
public class RegexDemo6 {
public static void main(String[] args) {
String s1 = "91 27 46 38 50";
String[] strArray = s1.split(" ");
//转换成int型
int[] arr = new int[strArray.length];
for(int i = 0; i < strArray.length; i ++) {
arr[i] = Integer.parseInt(strArray[i]);
}
//对数组进行排序
Arrays.sort(arr);
//把排序后的int数组再组装成一个字符串(拼接)
StringBuilder sb = new StringBuilder();
for(int i = 0; i < strArray.length; i ++) {
sb.append(arr[i]).append(" ");
}
//转换为字符串
String result = sb.toString().trim();
System.out.println("result:"+result);
}
}
3.替换功能:
/*
* 替换功能
* String类的public String[] replaceAll(String regex,String replacement)
* 使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
*/
public class RegexDemo7 {
public static void main(String[] args) {
String s = "Helloqq123456789world987654321java";
//将字符串中所有的数字用‘*’替换掉
String regex = "\\d+";
String ss = "*";
String result = s.replaceAll(regex, ss);
System.out.println(result);
}
}
4.获取功能:Pattern和Matcher类
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 获取功能
* 案例:获取下面这个字符串中由3个字符组成的单词
* da jia hao wo bu shi huai ren.
*/
public class RegexDemo8 {
public static void main(String[] args) {
String s = "da jia hao wo bu shi huai ren.";
//规则 \\b单词边界
String regex = "\\b\\w{3}\\b";
//把规则编译成模式对象
Pattern p = Pattern.compile(regex);
//通过模式对象得到匹配器对象
Matcher m = p.matcher(s);
// 调用匹配器对象的功能
// 通过find方法就是查找有没有满足条件的字串
// public boolean find();
// boolean flag = m.find();
// System.out.println(flag);
//
// 如何得到值
// public String group();
// String ss = m.group();
// System.out.println(ss);
//注意:再调用group()之前,必须先调用find()
while(m.find()) {
System.out.println(m.group());
}
}
}