Pattern & Matcher类
1.正则表达式常用的语法:
2.正则表达式中的常用方法:
(1)String类中的特有功能:
public boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式
(2)String类的分割功能:
public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串
注:返回值类型是一个字符串数组类型
(3)String类中的替换功能(与正则表达式有关):
public String replaceAll(String regex,String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
3.模式和匹配器的使用(Pattern & Matcher类中的方法):
步骤:
(1)获取模式对象:
public static Pattern compile(String regex) 将给定的正则表达式编译成一个模式对象
(2)通过模式获取匹配器对象 (将一个字符串类型的数据):
public static Matcher matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器
(3)调用Matcher类中的匹配器判断当前录入的字符串是否和正则规则相匹配
public boolean matches() 尝试将整个区域与模式匹配
例(模式匹配器):
public class PatternDemo {
public static void main(String[] args) {
//1)获取模式对象(通过正则规则)
Pattern p = Pattern.compile("a*b") ;
//2)通过模式获取匹配器对象,(将一个字符串类型的数据)
Matcher m = p.matcher("aaaaaab") ;
//3)调用Match(匹配器类)中的:public boolean matches():判断当前用户录入的字符串是否和当前的正则规则匹配
boolean flag = m.matches() ;
//4)输出
System.out.println("flag:"+flag);
}
}
例(String分割功能的应用):
public class PatternDemo {
public static void main(String[] args) {
//定义个字符串
String str1 = "aa,bb,cc" ;
//使用分割功能
String [] strArray1 = str1.split(",") ;
//遍历字符串数组
for(int x = 0 ; x < strArray1.length; x ++){
System.out.println(strArray1[x]);
}
System.out.println("------------------");
//字符串:
String str2 = "aa bb cc" ;
//使用切割功能:
String[] strArray2 = str2.split(" +") ; //正则:表示一个或多个空格
for(int x = 0 ; x <strArray2.length ; x++){
System.out.println(strArray2[x]);
}
System.out.println("--------------------");
String str3 = "aa.bb.cc" ;
//分割功能
String[] strArray3 = str3.split("\\.") ; //定义正则:表示一个点
for(int x =0 ; x<strArray3.length ; x ++){
System.out.println(strArray3[x]);
}
//硬盘上的路径表现形式:用两个反斜线代表一个反斜线
//E:\\JavaSE\\JavaCode\\day13
String str4 = "E:\\JavaSE\\JavaCode\\day13" ;
//使用分割功能
String[] strArray4 = str4.split("\\\\") ;
for(int x = 0 ; x <strArray4.length ; x ++){
System.out.println(strArray4[x]);
}
}
}
例(String类替换功能的应用)
public class PatternDemo {
public static void main(String[] args) {
//定义一个字符串:
String str = "helloword123JavaSE45678Javaweb" ;
//需求:让当前这个字符串中的数字不显示出来
//定义当前大串中数字定义正则规则
//String regex = "[0-9]+" ;
String regex = "\\d+" ;
String s = "*" ;
//public String replaceAll(String regex,String replacement)
String result = str.replaceAll(regex, s) ;
System.out.println("result:"+result);
}
}
课堂练习
练习一
/*
* 需求:校验一个QQ号码
* 规则:1.由5到10位组成的数字
* 2.不能以0开头
* */
/*
* 分析:
* 1)键盘录入一个QQ号码,使用字符串接收
* 2)定义一个校验QQ的功能
* 3)在main()中调用返回boolean类型
* */
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args) {
//创建键盘了录入对象
Scanner sc = new Scanner(System.in) ;
//录入并接收数据
System.out.println("请您输入QQ号码: ");
String QQ = sc.nextLine() ;
boolean flag = checkQQ(QQ) ;
System.out.println("flag: "+flag);
}
public static boolean checkQQ(String qq){
//定义正则规则
String regex = "[1-9][0-9]{4,9}" ;
//public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。
boolean flag = qq.matches(regex) ;
return flag ;
//直接返回
//return qq.matches("[1-9]\\d{4,9}");
}
}
练习二
/*
* 需求:校验手机号码
* 规则:1.第一位是1
* 2.第二位为3-8
* 3.一共11位数字
* */
/*
* 分析:
* 1)创建键盘录入对象,录入手机号码
* 2)定义正则规则:
* 3)String类的特有功能
* public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。
* 4)输出
* */
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入并接收
System.out.println("请您输入一个手机号码:");
String phone = sc.nextLine() ;
//定义正则规则
String regex = "1[38][0-9]{9}" ;
//匹配当前正则表达式是否和录入的手机号符合
boolean flag = phone.matches(regex) ;
System.out.println("flag:"+flag);
}
}
练习三
/*
* 需求:校验邮箱
* 规则:919081924@qq.com
* fengqingyang@163.com
* xxxxx@126.com
* zhangsan@westos.com
* lisi@sina.com
* wangwu@istone.com.cn....
* */
/*
* 分析:
* 1)键盘录入邮箱
* 2)定义正则规则
* 3)使用String中的特有功能校验
* 4)输出
* */
import java.util.Scanner;
public class RegexDemo {
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}(\\.[a-zA-Z]{2,3})+" ;
//校验
boolean flag = email.matches(regex) ;
System.out.println("flag:"+flag);
}
}
练习四
/*
* 需求:String分割功能的应用
* 18-24岁年龄的查找
* */
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args) {
//定义一个字符串
String ages = "18-24" ;
//定义正则规则
String regex = "-" ;
//根据正则规则进行分割public String[] split(String regex)
String[] strArray = ages.split(regex) ;
//获得当前字符数组中的元素(转换int类型的数据)
int startAge = Integer.parseInt(strArray[0]) ;
int endAge = Integer.parseInt(strArray[1]) ;
//键盘录入一个年龄,属于int类型的数据
//创建键盘录入对象
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("不是我们要找的");
}
}
}
练习五
/*
* 需求:键盘录入一串数字,中间用空格隔开,进行排序后输出
* 输入字符串:"1 3 2 5 4";
进行排序后输出"1 2 3 4 5"
*
* 分析:
1)定义这个字符串
2)使用分割功能分割成一个字符串数组
3)如何得到一个int类型数组:动态初始化定义int数组 int[] arr = new int[字符串数数组.length] ;
4)遍历int数组
获取每一个元素:arr[x] = Integer.parseInt(字符串数组对象[x])
5)排序:Arrays数组工具类型快速排序:sort(arr)
6)再去遍历int类型数组获取每一个元素,用字符串缓冲区来进行拼接
7)输出字符串
*
*
* */
import java.util.Arrays;
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args){
System.out.println("请输入一串数字,中间用'空格'隔开:");
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
//定义正则规则
String regex = " ";
//使用分割功能
String[] strArray = s1.split(regex); //注:返回的为字符串数组
//动态初始化
int [] arr = new int[strArray.length];
//遍历int类型数组,进行数组的动态赋值
for(int i=0;i<arr.length;i++){
arr[i] = Integer.parseInt(strArray[i]);
}
//调用Arrays类的排序功能
Arrays.sort(arr);
/*方式一:使用Arrays类中的toString()方法来转换成字符串
* String s3 = Arrays.toString(arr);
* System.out.println(s3);
* */
//方式二:使用StringBuilder
StringBuilder sb = new StringBuilder();
//遍历进行StringBuilder的拼接
for(int i=0;i<arr.length;i++){
sb = sb.append(arr[i]).append(" ");
}
//将sb转换为String类型,并去除两端空格
s1 = sb.toString().trim();
System.out.println(s1);
}
}