黑马程序员(四):正则表达式的几种应用

正则表达式:符合一定规则的表达式
作用:用于专门操作字符串
特点:用于一些特点的符号来表示一些代码操作,这样就简化书写。
好处:可以简化对字符串的复杂操作。
弊端:


具体操作功能:
1,匹配 String matches方法。用于规则匹配整个字符串,只要有一处不符合规则就匹配结束返回false
2,切割 String split();
3. 替换
4. 获取 将字符串中的符合规则的字串取出
步骤:1,先将正则表达式封装成对象
 2,将正则对象和要操作的字符串相关联。
 3,关联后,获取正则匹配引擎

 4,通过引擎对符合规则的子纯进行操作。比如取出.

class  Demo
{
	public static void main(String[] args) 
	{
		//匹配
		matche("b9238","[a-zA-Z]\\d");
		matche("b9238","[a-zA-Z]\\d*");
		matche("234455","[1-9][0-9]{4,11}");//匹配qq号。6-13位.
		
		//切割
		splitDemo("c:\\abc\\a.txt","");
		//用两个反斜杠\切割。但是每个\都要用\转义一下。所以变成\\\\ 结果是 c: abc a.txt
		splitDemo("asf.agsg.gg","\\.");
		//道理同上.是一个通配符。如果当成字符.进行切割的话需要\转义。但是\也要转义下
		//所以要用\\.  结果是:asf agsg gg
		splitDemo("erkkyezgzefggewed","(.)\\1+");//按照叠词完场切割,为了可以让规则的结果被重用
												//可以将规则封装成一个组,用()完成,组的出线都有编号。从1开始想要使
												//已有的组可以通过\n(n就是组的编号)的形式来获取。
	
		//替换
		String str="wer1389890000999ty123456uiod1234345433f";//要求将字符串中的数字替换成#
		replaceAllDemo(str,"\\d{5,}","#");//数字连续出现5次以上的替换成#;
		String str1="erkkyezgzefggewed";//要求将叠词替换成#
		replaceAllDemo(str1,"(.)\\1+","#");
		String str2="erkkyezgzefggewed";//要求将叠词单个字母zzzz----z
		replaceAllDemo(str2,"(.)\\1+","$1");//$1特殊符号代表前面规则的第一个组。
		
	
	
	}

	public static void matche(String str,String reg)
	{
		boolean b=str.matches(reg);
		System.out.println(b);

	}
	public static void splitDemo(String str,String reg)
	{
		//根据切割符号把字符串切割成数组
		String[] arr=str.split(reg);
		//打印下切割完之后的字符串长度
		//System.out.println(arr.length);
		for(String s:arr)//高级for循环
		{
			System.out.println(s);
		}
	}

	public static void replaceAllDemo(String str,String reg,String newStr)//依次表示 初始字符串 替换的字符串规则 替换成新的字符串
	{
		str=str.replaceAll(reg,newStr);
		System.out.println(str);
	}

	
}
几种示例的打印结果分别是

false
true
true
c:\abc\a.txt
asf
agsg
gg
er
yezgzef
ewed
wer#ty#uiod#f
er#yezgzef#ewed
erkyezgzefgewed



下面代码是获取的应用

class RegexDemo
{

	public static void  main(String[] args)
	{
		String str="ming tian jiu yao fang jia le ,da jia.";
		//将规则封装成对象
		String reg="\\b[a-z]{4}\\b";// 匹配器规则是四个字母的单词\\b代表单词标界。
		Pattern p=Pattern.compile(reg);
		//将正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m=p.matcher(str);
		//System.out.println("matches:"+m.matches());//用于获取匹配后规则。第一个用法其实就是他的简写
		while(m.find()) //匹配器开始工作查找,每次查找都会从匹配器指针的位置继续向下查找知道结束。类似迭代器
		{
			System.out.println(m.group());//把匹配器查找到的匹配的结果打印出来
			System.out.println(m.start()+","+m.end());//匹配器每次匹配到结果所开始的指针序列号和结束的指针序列号。
		}

	}
}

打印结果是:

ming
0,4
tian
5,9
fang
18,22


下面几个小例子。。对正则表达式深入了解下。

class Demo
{
	public static void main(String[] args)
	{
		test_1();
		test_2();
	
	}
	public static void test_1()
	{
		String str="我...我我...我要...要要....要学学...学学学编....编....编编程....程.....程";//转译成我要学编程
		String regex1="\\.";
		String str1=str.replaceAll(regex1,"");//去掉.
		String regex2="(.)\\1*+";
		String str2=str1.replaceAll(regex2,"$1");//去掉重复的字并且保留第一个字
		System.out.println(str2);
	}

	public static void test_2()
	{
		String str="192.68.1.254 102.49.23.130 10.10.10.10 2.2.2.2 8.109.90.30";//将ip地址按照数字顺序进行提取
		//转成集合进行排序。。
		String str1=str.replaceAll("([0-9]{1,3})","00$1");//进行补0,因为字符串排序时一个一个字符排序的。10会比2排在后面所以补0
		System.out.println(str1);
		String str2=str1.replaceAll("0{1,2}([0-9]{3})","$1");//把超过3位的前面0去掉
		System.out.println(str2);
		String[] str3=str2.split(" ");
		TreeSet<String> ts=new TreeSet<String>();//创建treeset集合。数组放进去后会自动排序
		for(String s:str3)
		{
			ts.add(s);
		}
		for(String s:ts)
		{
			System.out.println(s.replaceAll("0+(\\d+)","$1"));//排序号的。数组打印出来
		}
	}
	
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值