package com.collection.regex;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.Test;
/*
正则表达式主要是用于操作字符串的规则,主要体现在以下几种应用:
匹配:matches(String regex)
切割:split(String regex)
替换:replaceAll(String regex, String replacement)
查找:
匹配、切割、替换都是字符串的操作方法,而查找不再是字符串的方法了;
查找需要使用的对象:
1、Pattern(正则对象)
2、Matcher(匹配器对象)
指定为字符串的正则表达式必须首先被编译为Pattern类的实例;然后,可将得到的正则对象匹配
任意的字符串用于创建Matcher对象,执行匹配所涉及的所有状态都驻留在匹配器中,所以多个
匹配器可以共享同一个模式;
典型的调用顺序:
Pattern p = Pattern.compile("正则");
Matcher m = p.matcher("字符串");
boolean b = m.matches();
匹配器对象要使用到的方法:
find():通知匹配器去匹配字符串,查找符合规则的字符串;如果能查到符合规则的字符串,返回true;
group():获取或者规则的子串;
注意:使用group()方法的时候,一定要先调用find()方法去查找匹配规则的字符串;否则报错;
*/
public class Demo3 {
// 匹配方法
@Test
public void test1(){
// 匹配手机号;
// 手机号规则:1、只能1开头; 2、第二位只能为3 4 5 7 8; 3、长度只能是11位;
// String phone = "01377093832"; // 非法手机号
// String phone = "13770934"; // 非法手机号
String phone = "13770934832"; // 合法手机号
String regex = "1[34578]\\d{9}";
System.out.println(phone.matches(regex)?"合法手机号":"非法手机号");
// 匹配固定电话;
// 固定电话规则:区号-主机号;1、区号首位是0,长度3~4位;2、主机号首位不能是0,长度7~8位;
String telPhone = "025-88262187";
regex = "0\\d{2,3}-[1-9]\\d{6,7}";
System.out.println(telPhone.matches(regex)?"合法固话":"非法固话");
}
// 切割方法
@Test
public void test2(){
String str = "明 天 下 雨";
// 要求:按照空格切割字符串
String[] strs = str.split(" "); // 当存在多个空格时就不能用此方法切割了;
System.out.println(Arrays.toString(strs));
String[] strss = str.split(" +"); // 使用正则表达式进行切割;(" +":表示一个或多个空格);
System.out.println(Arrays.toString(strss));
// 根据重叠词进行切割
String str2 = "大家家家家明天天玩得得得开心心心"; // 切割结果应该是:大 明 玩 开
// 如果正则的内容需要被复用,那么就需要对正则的内容进行分组;分组的目的是为了提高正则的复用性;
// 组号不能指定,只能从1开始;
// (.)\\1+ :. 表示任意字符,叠词就是指后面的字符跟前面的任意字符表示的字符一样,那么就需要复用任意字符(.),
// 如果要复用正则,那么就需要先对正则分组,分组用小括号()表示;(.)就表示对任意字符 . 进行分组了,且组号为1;
// \\1 表示复用第1组正则,+ 表示复用1次或多次;
String[] strs2 = str2.split("(.)\\1+");
System.out.println(Arrays.toString(strs2));
/*
分组:
((A)(B(C))) 分为几组,分别是哪几组?
有几对括号就分为几组;组号按照左括号从左向右增加;
第1组:((A)(B(C)))
第2组:(A)
第3组:(B(C))
第4组:(C)
\1 :表示引用第一组所匹配的内容;
\2 :表示引用第二组所匹配的内容;
\3 :表示引用第三组所匹配的内容;
以此类推...
*/
}
// 替换方法
@Test
public void test3(){
// 将广告电话替换成****
String str = "有事请拨打电话13770934932";
str = str.replaceAll("1[34578]\\d{9}", "****");
System.out.println(str); // 有事请拨打电话****
// 将重叠词替换成一个;替换结果:我要做项目
String str2 = "我我我要要做做做做做项目目目目";
// 如果需要在replaceAll()方法正则表达式的外部引用分组正则的内容,那么可以使用"$组号";
str2 = str2.replaceAll("(.)\\1+", "$1");
System.out.println(str2);
}
// 查找方法
@Test
public void test4(){
String regex = "1[34578]\\d{9}"; // 创建正则表达式,匹配手机号
Pattern p = Pattern.compile(regex); // 用指定的正则表达式实例化Pattern对象(正则对象)
Matcher m = p.matcher("13770934832"); // 用正则对象匹配任意字符串,得到Matcher对象(匹配器对象)
boolean b = m.matches(); // 调用匹配器对象的matches()方法进行匹配
System.out.println(b);
// \\b:表示单词边界;只代表了单词的开始或者结束部分,不匹配任何的字符;
// 只要单词被任意字符区分开了,都可以匹配\\b;
// 如果单词被任意字符连接起来了,都不可以匹配\\b;
System.out.println("单词边界:" + "ni hao".matches("ni hao")); // true
System.out.println("单词边界:" + "ni hao".matches("\\bni hao")); // true
System.out.println("单词边界:" + "ni hao".matches("ni\\b hao")); // true
System.out.println("单词边界:" + "ni hao".matches("ni \\bhao")); // true
System.out.println("单词边界:" + "ni hao".matches("ni hao\\b")); // true
System.out.println("单词边界:" + "ni,hao".matches("ni\\b,hao")); // true
System.out.println("单词边界:" + "ni;hao".matches("ni\\b;hao")); // true
System.out.println("单词边界:" + "ni_hao".matches("ni\\b_hao")); // false
System.out.println("单词边界:" + "nihao".matches("ni\\bhao")); // false
System.out.println("单词边界:" + "ni\thao".matches("ni\\b\thao")); // true
System.out.println("单词边界:" + "ni\nhao".matches("ni\\b\nhao")); // true
// 找出三个字母组成的单词
String str = "da jia de jia qi jie shu le, hai kai xin ma?";
// \\b:表示单词边界;在三个字母组成的单词前面和后面都添加单词边界(\\b);
String reg = "\\b[a-z]{3}\\b";
// 先把字符串的正则表达式编译成Pattern对象(正则对象);
Pattern p2 = Pattern.compile(reg);
// 使用正则对象匹配字符串,产生一个Matcher对象(匹配器对象);
Matcher m2 = p2.matcher(str);
// System.out.println("是否存在匹配的字符串:" + m2.find());
// System.out.println("获取匹配的字符串:" + m2.group());
// 循环获取匹配的字符串
while (m2.find()){
System.out.println(m2.group());
}
}
// 练习
@Test
public void test5(){
// 查找出下面字符串中所有的邮箱:(.com .cn .net. .com.cn)
String content = "有事请联系:112233@qq.com;有事请联系:112233@qq.net;有事请联系:112233@qq.cn;"
+ "有事请联系:112@163.com;有事请联系:1122@sinlang.com.cn;有事请联系:zhangsan@139.com;"
+ "有事请联系:123jack@yahu.net;有事请联系:112233987654@tx.com;有事请联系:123_Lucy@wo.com.cn;";
// 正则表达式:
// [a-zA-Z1-9]:第1位只能是字母或是不为0的数字;
// \\w+:第二位开始可以是任意单词字符;+表示1个或多个;
// @:就表示@本身;
// [a-zA-Z0-9]+:表示1个或多个任意字母或数字;
// (\\.(com|cn|net)):表示分组,组号为1;
// {1,2}表示分组内容可以出现1次或2次;
// \\. :就表示 . ;
// (com|cn|net):表示分组;组中的内容表示:可以是com、或者cn、或者net;"|" 表示或者;
String re = "[a-zA-Z1-9]\\w+@[a-zA-Z0-9]+(\\.(com|cn|net)){1,2}";
Pattern pa = Pattern.compile(re);
Matcher ma = pa.matcher(content);
while (ma.find()){
System.out.println(ma.group());
}
}
}
Java学习笔记之正则表达式(二):正则表达式的应用
最新推荐文章于 2023-01-17 17:33:02 发布