Java学习笔记之正则表达式(二):正则表达式的应用

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());
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值