黑马程序员——java编程那些事儿____正则表达式

                                                                                           -------android培训java培训、期待与您交流! ----------


一 正则表达式概述


 1)定义:符合一定规则的表达式。

2)作用:用于专门操作字符串
3)特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
4)所以学习正则表达式,就是在学习一些特殊符号的使用。
5)好处:可以简化对字符串的复杂操作。
6)弊端:符号定义越多,正则越长,阅读性越差。


二 正则表达式具体操作功能


我将毕老师讲的功能进行了封装,并且进行了具体的总结,便于以后复习哈

/*
正则表达式
  具体操作功能
     1.匹配  String matches(); 用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
							
	 2.切割  String split();

	 3.替换  String replaceAll();

	 4.获取  将字符串中符合规则的子串取出
				 	 操作步骤	1)将正则表达式封装成对象
								2)让正则对象和要操作的字符串相关联
								3)关联后,获取正则匹配引擎
								4)通过引擎对符合规则的子串进行操作,比如取出

*/
import java.util.regex.*;//演示获取的时候用到


class RegexDemo 
{
	public static void main(String[] args) 
	{
		/*
		匹配
		//demo();
		//checkQQ_1();
		//checkQQ_2();
		//checkTel();
		*/
//------------------------------------------------------------------------
		/*
		切割
		splitDemo("zhangsan    lisi   wangwu"," +");//按多个空格切割
		splitDemo("zh.hahha.zizi","\\.");//按.切割
		splitDemo("c:\\abc\\a.txt","\\\\");//按\\切割
        */
		splitDemo("fauuudadiidadagglop","(.)\\1+");//按叠词切割。为了可以让规则的结果被重用,可以将规则封装成一个组,用()完成。
		                                           //组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)的形式
												  // 来获取

												  // ((())(())) 有5个组,几个左括号就有几个组
		
		
//------------------------------------------------------------------------

		/*
		替换
		String str = "rerq1321212121afaraqe54254252fsfs";
		replaceAllDemo(str,"\\d{5,}","#");//将字符串中的数组替换成#

		String str1 = "fauuudadiidadagglop";
		replaceAllDemo(str1,"(.)\\1+","&");//将叠词替换成&
		replaceAllDemo(str1,"(.)\\1+","$1");//将重叠的字符替换成单个字母(zzz->z)
		*/
//------------------------------------------------------------------------

		
		//获取
		getDemo();
	}



//========================================================================
	public static void getDemo()
	{
		String str = "ming tian jiu yao fang jia le ,da jia";
		String reg = "\\b[a-z]{3}\\b";

		//将规则封装成对象
		Pattern p = Pattern.compile(reg);
		//让正则对象和要作用的字符串相关联,获取匹配器对象
		Matcher m = p.matcher(str);
		
		//System.out.println(m.matches());//其实String类中的matches方法用的就是Pattern和Matcher对象来完成的
										//只不过被String的方法封装后用起来比较简单。但是功能却单一。
		
/*		
		//通过引擎对符合规则的子串进行操作
		boolean b = m.find();
		System.out.println(b);
		//用于获取匹配后的结果
		System.out.println(m.group());
*/		

		//通过引擎对符合规则的子串进行操作并获取匹配后的结果
		while(m.find())
		{
			System.out.println(m.group());
			//System.out.println(m.start()+"..."+m.end());
		}
	}
	
//========================================================================

	public static void replaceAllDemo(String str,String reg,String newStr)
	{
		str = str.replaceAll(reg,newStr);//str已经定义了
		System.out.println(str);
		/*
		String s = str.replaceAll(reg,newStr);
		System.out.println(s);
		*/
	}

//========================================================================

	public static void splitDemo(String str,String reg)
	{
		String[] arr = str.split(reg);
		//System.out.println(arr.length);
		for(String s : arr)
		{
			System.out.println(s);
		}
	}
	

//========================================================================

	public static void demo()
	{
		String str = "a34";
		String reg = "[a-zA-Z]\\d?";

		boolean b = str.matches(reg);
		System.out.println(b);
		
	}
	
	//需求:匹配手机号码   要求:只有 13xxx 15xxx 18xxx
	public static void checkTel()
	{
		String tel = "19897986987";
		String reg = "1[358]\\d{9}";
		boolean b = tel.matches(reg);
		System.out.println(b);
	}

	//需求:对QQ号码进行校验,  要求:5~15 0不能开头 只能是数字
	public static void checkQQ_2()//使用正则表达式
	{
		String qq = "1928759832";
		String reg = "[1-9]\\d{4,14}";
		
		boolean flag = qq.matches(reg);
		if(flag)
			System.out.println(qq+"...is ok");
		else
			System.out.println(qq+"...nono");
	}

	public static void checkQQ_1()//使用String类中的方法,进行组合完成了需求
	{
		String qq = "0121212";
		int len = qq.length();
		if(len>=5 && len<=15)
		{
			if(!qq.startsWith("0"))
			{
				try
				{
					long l = Long.parseLong(qq);
					System.out.println("qq:"+qq);
				}
				catch (NumberFormatException e)
				{
					System.out.println("出现非法字符.....");
				}
				/*
				char[] arr = qq.toCharArray();//将此字符串转换为一个新的字符数组
				boolean flag = true;
				for(int x=0;x<arr.length;x++)
				{
					if(!(arr[x]>='0' && arr[x]<='9'))
					{
						flag = false;
						break;
					}
				}
				if(flag)
				{
					System.out.println("qq:"+qq);
				}
				else
				{
					System.out.println("出现非法字符");
				}
				*/
			}
			else
			{
				System.out.println("不可以0开头");
			}
		}
		else
		{
			System.out.println("长度错误");
		}
	}
}



三 正则表达式练习


需求都写在了代码里,

import java.util.*;
class RegexTest 
{
	public static void main(String[] args) 
	{
		//test();
		//ipSort();
		checkMail();
	}

	
	/*
	需求:对邮件地址进行校验
	*/
	public static void checkMail()
	{
		String mail = "abc12@sina.com";
		String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//相对精确的匹配
		reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配

		//mail.indexOf("@")!=-1;//只要有@就可以

			
		System.out.println(mail.matches(reg));
	}


	/*
	需求:
		将下列字符串转成:我要学编程

	思路:
		到底使用四种功能中的哪一个呢?或者哪几个呢?

		1,如果只想知道该字符是对是错,使用匹配
		2,想要将已有的字符串变成另一个字符串,使用替换
		3,想要按照自己的方式将字符串变成多个字符串,使用切割    获取规则以外的字串
		4,想要拿到符合需求的字符串子串,使用获取    获取符合规则的字串

	*/

	public static void test()
	{
		String str = "我我我我..要要要..要要....要要学....学学学学....编编编.....编编.编编...程程....程程程";
		/*
		将已有字符串变成另一个字符串,使用替换

		1,可以先将 . 去掉
		2,再将多个重复的内容变成单个内容
		*/

		str = str.replaceAll("\\.+","");
		System.out.println(str);
		str = str.replaceAll("(.)\\1+","$1");
		System.out.println(str);
	}


	/*
	需求 
		已知ip地址 192.68.1.254 102.29.39.234 10.10.10.10 2.2.2.2 8.109.09.30
	    将ip地址进行地址段顺序的排序

	思路 
		还按照字符串自然顺序,只要让它们每一段都是3位即可
		1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位
		2,将每一段只保留3位,这样,所有的ip地址都是每一段3位
	     
	*/
	public static void ipSort()
	{
		String ip = "192.68.1.254 102.29.39.234 10.10.10.10 2.2.2.2 8.109.09.30";
		ip = ip.replaceAll("(\\d+)","00$1");
		System.out.println(ip);

		ip = ip.replaceAll("0*(\\d{3})","$1");
		System.out.println(ip);

		String[] arr = ip.split(" +");
		
		TreeSet<String> ts = new TreeSet<String>();
		
		for(String s : arr)
		{
			ts.add(s);
		}
		for(String s : ts)
		{
			System.out.println(s.replaceAll("0*(\\d+)","$1"));
		}
	}
}



四 网页爬虫


这个网页爬虫可不是一般的虫子,以后开发会用到

//网页爬虫
import java.io.*;
import java.util.regex.*;
import java.net.*;
class RegexTest2 
{
	public static void main(String[] args) throws Exception
	{
		//getMails();
		getMails_1();
	}

	/*
	获取网页中的邮件地址
	*/
	public static void getMails_1() throws Exception
	{
		URL url = new URL("http://127.0.0.1:8080/myweb/mail.html");

		URLConnection conn = url.openConnection();
		
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(conn.getInputStream());

		String line = null;

		String reg = "\\w+@\\w+(\\.\\w+)+";
		Pattern p = Pattern.compile(reg);

		while((line=bufr.readLine())!=null)
		{
			Matcher m = p.matcher(line);
			while(m.find())
			{
				System.out.println(m.group());
			}
		}				
	}


	/*
	获取指定文档中的邮件地址  使用获取功能
	*/
	public static void getMails() throws Exception
	{
		
		//关联文件
		BufferedReader bufr = 
			new BufferedReader(new FileReader("mail.txt"));

		String line = null;

		//定义规则
		String reg = "\\w+@\\w+(\\.\\w+)+";

		//将规则封装成对象
		Pattern p = Pattern.compile(reg);


		while((line=bufr.readLine())!=null)
		{
			//让正则对象和要作用的字符串相关联,获取匹配器对象
			Matcher m = p.matcher(line);

			//通过引擎对符合规则的子串进行操作并获取匹配后的结果
			while(m.find())
			{
				System.out.println(m.group());
			}
		}
		
	 }
}



 -------android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的影城管理系统,源码+数据库+论文答辩+毕业论文+视频演示 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多生活之中,随之就产生了“小徐影城管理系统”,这样就让小徐影城管理系统更加方便简单。 对于本小徐影城管理系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据小徐影城管理系统的现状来进行开发的,具体根据现实的需求来实现小徐影城管理系统网络化的管理,各类信息有序地进行存储,进入小徐影城管理系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台;首页、电影信息、电影资讯、个人中心、后台管理、在线客服等功能。 本论文主要讲述了小徐影城管理系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的小徐影城管理系统状况,提高管理效率。 关键词:小徐影城管理系统;Spring Boot框架,MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值