黑马程序员——Java基础---正则表达式

-------  android培训 java培训 、java学习型技术博客、期待与您交流! ----------
一、简述
  • 概念:符合一定规则的表达式,用于操作字符串。
  • 特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。简化了代码的书写。
  • 好处:正则的出现,对字符串的复杂操作变得更为简单。
  • 弊端:符号的出现虽然简化了书写,但是却降低了阅读性。
  • 组:
            用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
            只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。
            (aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。
            对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。
二、常见操作
  1. 匹配:其实用的就是String类中的matches方法。
              String reg = "[1-9][0-9]{4,14}";
              boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。
  2. 切割:其实用的就是String类中的split方法。
  3. 替换:其实用的就是String类中的replaceAll();
  4. 获取:
    1. 先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);
    2. 通过Pattern对象获取Matcher对象。
      • Pattern用于描述正则表达式,可以对正则表达式进行解析。
      • 而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。
      • 如何获取匹配器对象:通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。
    3. 使用Matcher对象中的方法即可对字符串进行各种正则操作。

  • 四种功能的选择(思路方式):
    • 如果只想知道该字符是否对是错,使用匹配。
    • 想要将已有的字符串变成另一个字符串,替换。
    • 想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
    • 想要拿到符合需求的字符串子串,获取。获取符合规则的子串。

练习:
  
import java.net.*;  
import java.util.regex.*;  
import java.io.*;  
class RegexTest 
{
	public static void main(String[] args) 
	{
		replace();
		checkMail();
		iPSort();
		getWebMail();
		getFileMail();
	}
	/* 
	练习: 
	需求:将下列字符串转成:我要学编程 
	"我我...我..我要...要...要要....学学....学学学......编编编...程...程程...." 
	
	思路: 
	将已有字符串变成另一个字符串。使用替换功能。 
	1、可以先将 . 去掉。 
	2、再将多个重复的内容变成单个内容。  
	*/
	public static void replace()
	{  
		String s="我我...我..我要...要...要要....学学....学学学......编编编...程...程程....";  
		System.out.println(s);
		
		String regex="\\.+";//先将 . 去掉
		s=s.replaceAll(regex,"");//去掉 . 
		System.out.println(s);
		
		regex="(.)\\1+";//将重复的内容变成单个内容
		s=s.replaceAll(regex,"$1");//去重
		System.out.println(s)
	}
	//匹配邮箱
	public static void checkMail()
	{
		String mail="123a809bc@sina.com.cn";  
		String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//较为精确  
		//regex="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。
		boolean b=mail.matches(regex);  
		System.out.println(b);  
	}  
	/* 
	需求: 
	将ip地址进行地址段顺序的排序。 
	192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301 
	
	思路: 
	还按照字符串自然顺序,只要让他们每一段都是3位即可。 
	1、按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。 
	2、将每一段只保留3位。这样,所有的ip地址都是每一段3位。 
	*/  
	public static void iPSort()   
	{
		String ip="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";  
		System.out.println(ip);
		String regex="(\\d+)";  
		
		ip=ip.replaceAll(regex,"00$1");//保证每段至少都有三位
		System.out.println(ip);  
		
		regex="0*(\\d{3})";  
		ip=ip.replaceAll(regex,"$1");//每段只保留三位  
		System.out.println(ip);  
		
		regex=" ";  
		String[] arr=ip.split(regex);//按照空格切  
		//定义一个TreeSet集合,利用元素自然排序  
		TreeSet<String > ts=new TreeSet<String>();  
		for (String str : arr )  
		{  
			ts.add(str);//添加  
		}  
		
		regex="0*(\\d)";//把每段前面多余的0替换掉  
		for (String s : ts)  
		{  
			System.out.println(s.replaceAll(regex,"$1"));//把每段前面多余的0替换掉  
		}  
	}  
	
	/* 
	网络爬虫(蜘蛛) 
	实际上是一个功能,用于搜集网络上的指定信息 
	需求:可用于收集邮箱,qq号等之类的信息。 
	应用:如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog 
	*/  
	//获取网页中mail  
	public static  void getWebMail()throws Exception  
	{  
		//封装网页地址  
		URL url=new URL("http://tieba.baidu.com/p/1390896758");  
		//连接服务器  
		URLConnection conn=url.openConnection();  
		//带缓冲区的网页读取流  
		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
		String line=null;   
		//定义匹配邮件地址的正则表达式  
		String regex="\\w+@\\w+(\\.\\w+)+";  
		Pattern p=Pattern.compile(regex);//封装正则表达式  
		//读取网页数据  
		while ((line=br.readLine())!=null)  
		{  
			//正则关联数据  
			Matcher m=p.matcher(line);  
			//寻找匹配邮箱  
			while (m.find())  
			{  
				System.out.println(m.group());//输出匹配邮箱  
			}         
		}     
	}  
	
	//获取指定文档中的邮件地址。使用获取功能。Pattern  Matcher  
	public static void getFileMail()throws Exception  
	{  
		//将文件封装成对象  
		File file=new File("E:\\Java Study\\Practice\\day25\\mail.txt");  
		//创建带缓冲区的读取流  
		BufferedReader br=new BufferedReader(new FileReader(file));  
		String line=null;  
		
		//定义正则表达式  
		String regex="\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+";  
		//创建Pattern对象,封装正则表达式  
		Pattern p=Pattern.compile(regex);  
		
		//读取文件中数据  
		while ((line=br.readLine())!=null)  
		{     
			//关流字符串  
			Matcher m=p.matcher(line);  
			while (m.find())//寻找匹配的字符串  
			{  
				System.out.println(m.group());//输出匹配的字符串  
			}  
		}  
	}  	
}
  

-------  android培训 java培训 、java学习型技术博客、期待与您交流! ----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值