Day 26 正则表达式

1.正则表达式

1.1概念

正则表达式定义了字符串的模式。

正则表达式可以用来搜索、编辑或处理文本。

不仅限于某一种语言,但是在每种语言中有细微的差异
 java中1.4推出,  java.util.regex包下
 
  在java中  使用\转义符,把有意义字符转换为无意义字符
 
  但是在正则表达式中,\也是转义符,所以如果我们在java中书写正则表达式的转义符的话,要写两个\\
  1.2语法

 \转义符
 *        .匹配任意字符
 *取值范围:
 *        [abc]:可能是a,也可能是b,也可能是c
 *        [^abc]:不是a,b,c任意一个
 *        [a-zA-Z]:匹配大小写字母
 *        [^a-zA-Z]:非大小写字母
 *        [0-9]:数字
 *        [a-zA-Z0-9]:大小写字母和数字
 *间接表示:
 *				. :任意字符
 *					\d:表示数字[0-9]
 *					\D:表示非数字 [^0-9]
 *					\s:表示由空字符组成
 *					\S:表示由非空字符组成
 *					\w:表示字母数字下划线[a-zA-Z0-9_]
 *					\W:表示非字母数字下划线[a-zA-Z0-9_]
 *数量相关:
 *				?:表示出现0或1次
 *				+:表示出现一次或多次count>=1
 *				*:表示出现0次或0次以上count>=0
 *				{n}:表示出现n次
 *				{n,}:表示出现n次或n次以上 count>=n
 *				{n,m}:表示出现n到m次   m>=count>=n
 *
 *():表示一个整体
 *					([a-z]|[0-9]){2}:a-z或0-9两个其中一个出现两次
 *[]:可以理解为字符组,字符组中-为连接符,表示区间范围
 *      			[0-9]:表示0123456789都可以
 *{}:表示范围
 *					
 *^:表示开头,在[]中表示取反
 *$:表示结尾
 *
 *在java中  正则表达式封装为三个相关的类
 *					PatternSyntaxException:异常类
 *					Pattern:正则表达式对象,能做一些简单操作
 *					Matcher:支持强大的正则表达式
 *
 *Pattern:很多时候我们直接使用String中的三个方法即可:
 *						验证:校验操作,boolean  matches(String regex)
 *						拆分:String[]split(String regex)
 *						替换:String replaceAll(String regex,String replace)

1.3在java中正则表达式

在java中正则表达式封装为三个相关的类
                     PatternSyntaxException:异常类
                     Pattern:正则表达式对象,能做一些简单操作
                    Matcher:支持强大的正则表达式

1.3.1Pattern

概述:

用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建

可以通过Pattern.complie(String regex)创建一个正则表达式

只能做一些简单的匹配操作

使用:

Pattern:很多时候我们直接使用String中的三个方法即可:
                         验证:校验操作,boolean  matches(String regex)
                         拆分:String[]split(String regex)
                         替换:String replaceAll(String regex,String replace)

public static void main(String[] args) {
	test1();
	test2();
}
//校验
public static void test2(){
		//非正整数
	String regex="(-?[1-9]\\d*|0)";
	String str="-123";
	//全词匹配,静态方法
	boolean flag=Pattern.matches(regex, str);
	System.out.println(flag);
	//String 中的方法
	System.out.println(str.matches(regex));
}
//拆分
public static void test1(){
	String str="1,2,3,4,5";
	//创建正则表达式
	Pattern pattern=Pattern.compile(",");
	//拆分方法
	String[]strs=pattern.split(str);
	//遍历
	for(String string:strs){
		System.out.println(string);
	}
	System.out.println("=========================");
	strs=str.split(",");
	for(String string:strs){
		System.out.println(string);
	}
	
}

  Matcher概述:

1.构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例 Matcher m = p.matcher("aaaaab");

2.支持便捷强大的正则匹配操作,包括分组、多次匹配支持

三大方法:

Matcher.matches():对整个字符串进行匹配,只有整个字符串都匹配了才返回true

Matcher.lookingAt():对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true

Matcher.find():对字符串进行匹配,匹配到的字符串可以在任何位置

字符串匹配模式:

public static void main(String[] args) {
	//整数规则
	String regex="(-?[1-9]\\d*)|0)";
	//需要校验的字符串
	String input="12.12";
	//引进对象
	Pattern pattern =Pattern.compile(regex);
	//匹配器对象
	Matcher matcher=pattern.matcher(input);
	/**
	 * 三种匹配模式
	 * 				matches:全词匹配
	 * 				find:任何位置均可  asd123das
	 * 				lookingAt:从前向后,前面是就可以   123sadasd
	 * 
	 */
	//false
	System.out.println(matcher.matches());
	//不要连着使用,每次使用  都重新打开一个matcher对象即可
	//find可以调用多次,因为find适合做一些提取操作
	matcher=pattern.matcher(input);
	System.out.println(matcher.find());
	System.out.println(matcher.find());
	System.out.println(matcher.find());
	matcher=pattern.matcher(input);
	System.out.println(matcher.lookingAt());
			
}

数据提取:

public static void main(String[] args) {
	//整数规则
	//[\u4e00-\u9fa5]汉字范围
	//一个小括号   就是一组
	String regex="([\u4e00-u9fa5]{2,3})电话号码是(\\d{11})";
	String input="asd小明电话号码是1311311311sass张小黑电话号码是1511511511511";
	//引进对象
		Pattern pattern=Pattern	.compile(regex);
		//匹配器对象
		Matcher matcher=pattern.matcher(input);
		/**
		 * find和group结合使用  可以完成数据提取
		 */
		//想要获取下一个匹配的数据,只需要再次调用find即可
		//如果find为false,说明后面没有符合条件的数据了
		while(matcher.find()){
			//0或者无参  都是获取匹配到的整个数据
			//1就是第一组,2就是第二组
			System.out.println(matcher.group(0));
			System.out.println(matcher.group(1));
			System.out.println(matcher.group(2));
		}

叠词去重:

我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.
 * 
 * 转换为我要学编程
 * 
 * 1.只留下汉字,其余字符去掉
 * 2.把重复数据分为两组,比如1111,分为1和111
 * 3.使用1把1111替换
 * @author 18370
 *
 */
public class MatcherTest_03 {
public static void main(String[] args) {
	String string="我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.";
	//1.先把.去掉
	//string=string.replaceAll("\\.","");
	//用空字符将除过汉字以外的全部替换
	string=string.replaceAll("[^\u4e00-\u9fa5]","");
	// ((我)(我我我我))(要)(要要要要)学学学学学编编编编编程程程程程程程
	System.out.println(string);
	// (.) : 任意字符
	// \\1 捕获1次,获取指定组的数据, //1就是第一组的数据,//2就是第二组的数据
	// (\\d)\\1 : 表示连续出现两个字符 , 11,22,33,44
	// (\\d)(a)\\1 : 第一个是数字,第二个是a,第三个和第一个相同 1a1,2a2,3a3
	// (\\d)(a)\\2 : 第一个是数字,第二是a,第三个和第二个一样,也是a,1aa,2aa,3aa
	String regex="(.)(\\1+)";
	//Pattern pattern=Pattern.compile(regex);
	//Mather matcher=pattern.matcher(string);
	//while(matcher.find()){
		//  //System.out.println(matcher.group(0));
		//  //System.out.println(matcher.group(1));
		//  //System.out.println(matcher.group(2));
		//string=string.replaceAll(matcher.group(0),matcher.group(1));
		//}
		//System.out.println(string);
		
		//$1就等于matcher.group(1);
		string=string.replaceAll(regex,"$1");
		System.out.println(string);
		
	}
public static void main(String[] args) {
	String string="我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.";
	//1.先把.去掉
	//string=string.replaceAll("\\.","");
	//用空字符将除过汉字以外的全部替换
	string=string.replaceAll("[^\u4e00-\u9fa5]","");
	String regex="(.)(\\1+)";
		//$1就等于matcher.group(1);
		string=string.replaceAll(regex,"$1");
		System.out.println(string);
		
	}

上一篇:数据权限-SpringJpa拦截示例


下一篇:Kafka是分布式发布-订阅消息系统