【黑马程序员】Java基础13:强大的正则

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


一、正则概述

1、正则用来操作字符串的特殊方法,都在String类中,是符合一定语法规则的字符串表达形式;

2、学习正则,就是学习一些特殊符号的使用,它能够简单、快捷的对字符串进行操作。

示例:对QQ号码进行校验,要求:5-15位、0不能开头、只能是数字。

思路:如果用传统方法,首先要规定长度,然后再判断首字母,最后再规定QQ字符串只能是数字形式,相当麻烦,正则校验如下:

	//示例:匹配QQ号码,一共5-15位,不能0开头,全是数字
	public static void checkQQ(){
		String QQ = "4555555555";
		String regex = "[1-9]\\d{4,14}";
		/*定义字符串的规则表达式
		第一位只能是1-9;第二位是 \d,即是0-9的数字,出现了4到14次*/

		boolean b = QQ.matches(regex);
		if(b)
			System.out.println("QQ:"+QQ+",输入正确");
		else
			System.out.println("QQ:"+QQ+",输入错误");
	}

二、正则的具体操作功能

1匹配功能: boolean matches(String regex),用规则匹配整个字符串,只要有一处不符合规则,匹配结束返回false 

	//匹配手机号,以13、15、18开头的11位数字
	public static void checkTel(){  
	    String tel = "16900001111";  
	    String telReg = "1[358]\\d{9}";  
	    System.out.println(tel.matches(telReg));  
	} 

2切割功能String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。

  用点来切割、用反斜杠切割、按照叠词切割、空格切割等。

package blog.itheima;

class RegexTest {
	public static void main(String[] args) {
		split("qwe.rfff.tjda.sf.hjj","\\.");//切割字符,其中有小数点
		split("E:\\JAVA\\Test\\1.6","\\\\");//用反斜杠把盘符和文件夹名切割出来
		split("qwerfffftjdasfhjjasgg","(.)\\1+");//按照叠词切割
		split("qwe   rfff  tjda      sf   hjj"," +");//切割字符,其中有空格
	}
	//正则的切割
	public static void split(String s, String regex){
		String[] arr = s.split(regex);
		for(String st : arr){
			System.out.println(st);
		}
	}
}

3替换功能:String replaceAll(String regex, Stringreplacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 

package blog.itheima;

class RegexTest {
	public static void main(String[] args) {
		replaceAll("qwerfffftjdasfhjjasgg","(.)\\1+","&");//把叠词换成字符&
		replaceAll("qwerfffftjdasfhjjasgg","(.)\\1+","$1");//把叠词换成相同的单个字母
		replaceAll("qwe12332234324asfhj234423432gg","\\d+","#");//把数字换成#号
		replaceAll("qwe12df4asj2342343tt23432gg","\\d{4,}","#");//若数字出现4个以上,就换成#号
	}
	//正则的替换
	public static void replaceAll(String str,String regex,String newStr){
		str = str.replaceAll(regex,newStr);
		System.out.println(str);
	}
/*	打印结果:
	qwer&tjdasfh&as&
	qwerftjdasfhjasg
	qwe#asfhj#gg
	qwe12df4asj#tt#gg*/
}

4、获取功能:

import java.util.regex.Pattern;

class RegexTest {
	public static void main(String[] args) {
		//切出三个字母的单词
		String str = "Ming tian jiu ke yi CRH hui Wuhan la, haha !";
		String regex = "\\b[a-zA-Z]{3}\\b";//其中 \b表示单词边界

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

		//获取正则匹配器,并和字符串相关联
		Matcher m = p.matcher(str);
		
		//boolean find() 按照匹配器的规则进行查找输入序列的下一个子序列。 
		while(m.find()){
			System.out.println(m.group());//返回符合规则的子序列
			System.out.println(m.start()+"-----"+m.end());
			//获得子序列在没改变字符串之前的初始和终止角标,包头不包尾
		}
	}
}

三、选取正则四种功能的思路

1、如果只想知道该字符是对是错,使用匹配功能;

2、想要将已有的字符串变成另一个字符串,替换;

3、想要按照自定义的方式将字符串变成多个字符串(或者获取规则以外的字符串),切割;

4、想要拿到符合需求的字符串子串,获取。

 

四、代码实例

1、制作网页蜘蛛,对网页上的进行抓取,并打印到控制台

2将ip地址进行地址段自然排序。

package blog.itheima;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class RegexWebSpider {
	public static void main(String[] args) throws Exception{
		//getMails();
		ipSort();
	}

	//1、制作网页蜘蛛,对网页上的邮箱进行校验,并打印成文本文件。
	public static void getMails() throws Exception{
		//任意指定需要获取资源的网页
		URL url = new URL("http://tieba.baidu.com/p/2347771086?pid=33278533714&cid=0#33278533714");
		
		//也可以从指定文件中读取资源
		//BufferedReader bf = new BufferedReader(new FileReader("mail.txt"));
		
		//连接到url所引用的远程对象
		URLConnection conn = url.openConnection();

		BufferedReader bf = 
				new BufferedReader(new InputStreamReader(conn.getInputStream()));
		//对邮箱进行验证: \w 单词字符:[a-zA-Z_0-9] 
		String reg = "\\w+@\\w+(\\.\\w+)+";

		Pattern p = Pattern.compile(reg);

		String line = null;
		while ((line=bf.readLine())!=null){
			Matcher m = p.matcher(line);
			while(m.find()){
				System.out.println(m.group());
			}
		}
	}
	
	//2、将ip地址进行地址段自然排序。
	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.30";
		ip = ip.replaceAll("(\\d+)","00$1");//把一个或者多个数字当作一组,先补二个0
		System.out.println(ip);
		//只留后三位数,去掉前面0,0*指0个或多个
		ip = ip.replaceAll("0*(\\d{3})","$1");
		System.out.println(ip);

		String[] arr = ip.split(" ");
		Arrays.sort(arr);
		for(String a : arr){
			System.out.println(a.replaceAll("0*(\\d+)","$1"));
		}
	}
}
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值