正则表达式(笔记二)

正则表达式对字符串的常见操作:

(1)匹配。验证字符串是不是手机号,其实使用的就是String类中的matches方法。

	public static void functionDemo_1(){		
		//匹配手机号码是否正确。 
		String tel = "15800001111";		
		String regex = "1[358]\\d{9}"; 
		boolean b = tel.matches(regex);
		System.out.println(tel+":"+b);
	}

输出结果:
15800001111:true
其中[358]表示第二位数字是3、5或者8其中的一位,“\\d”表示的是转义“\d”,而“\d”表示的是数字[0-9],{9}表示\\d重复九次,因为手机号是11位。

(2)切割。 基于叠词分割字符串,其实使用的就是String类中的split方法。

	public static void functionDemo_2(){
		String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";		
		String[] names = str.split("(.)\\1+");//str.split("\\.");		
		for(String name : names){
			System.out.println(name);
		}		
	}

输出结果:

zhangsan

xiaoqiang

zhaoliu

其中(.)表示组合,\\1+表示有很多类似组合中的叠词,“.”本身也是一种正则规则,表示的是任意字符。所以需要"\\."来进行转义。

(3)替换。其实使用的就是String类中的replaceAll()方法。

	public static void functionDemo_3() {		
		String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";		
		str = str.replaceAll("(.)\\1+", "$1");		
		System.out.println(str);		
		String tel = "15800001111";//158****1111;		
		tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");		
		System.out.println(tel);		
	}

输出结果:

zhangsantxiaoqiangmzhaoliu
158****1111

(4)获取

        /*
	 * 获取 
	 * 将正则规则进行对象的封装。 
	 * Pattern p = Pattern.compile("a*b");
	 *  //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher .
 	 * Matcher m = p.matcher("aaaaab");
 	 * //通过Matcher匹配器对象的方法对字符串进行操作。
 	 * boolean b = m.matches();	  
	 */
	public  static void functionDemo_4() {		
		String str = "da jia hao,ming tian bu fang jia!";		
		String regex = "\\b[a-z]{3}\\b";		
		//1,将正则封装成对象。
		Pattern p = Pattern.compile(regex);
		//2, 通过正则对象获取匹配器对象。 
		Matcher m = p.matcher(str);		
		//使用Matcher对象的方法对字符串进行操作。
		//既然要获取三个字母组成的单词 
		//查找。 find();
		System.out.println(str);
		while(m.find()){
			System.out.println(m.group());//获取匹配的子序列			
			System.out.println(m.start()+":"+m.end());
		}
	}

输出结果:

da jia hao,ming tian bu fang jia!
jia
3:6
hao
7:10
jia

29:32

实例

(1)治疗口吃

public static void test_1(){		
		String str = "我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程";		
		//1,将字符串中.去掉。 用替换。
		str = str.replaceAll("\\.+", "");
		System.out.println(str);		
		//2,替换叠词。
		str = str.replaceAll("(.)\\1+", "$1");
		System.out.println(str);		
	}
输出结果:

我我我我我我我要要要要要要要要要学学学学学学学编编编编编编编程程程程程程程
我要学编程

(2)对ip地址排序。

public static void test_2(){		
		String ip_str = "192.168.10.34  127.0.0.1  3.3.3.3  105.70.11.55";		
		//1,为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。
		//所以,补零,按照每一位所需做多0进行补充。每一段都加两个0.		
		ip_str = ip_str.replaceAll("(\\d+)", "00$1");
		System.out.println(ip_str);		
		//然后每一段保留数字3位。
		ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
		System.out.println(ip_str);		
		//1,将ip地址切出。
		String[] ips = ip_str.split(" +");		
		TreeSet<String> ts = new TreeSet<String>();		
		for(String  ip : ips){
//			System.out.println(ip);
			ts.add(ip);
		}		
		for(String ip : ts){
			System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
		}		
	}
输出结果:

00192.00168.0010.0034  00127.000.000.001  003.003.003.003  00105.0070.0011.0055
192.168.010.034  127.000.000.001  003.003.003.003  105.070.011.055
3.3.3.3
105.70.11.55
127.0.0.1
192.168.10.34

(3)对邮件地址校验。

public static void test_3() {		
		String mail = "[email protected]";		
		String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";		
		regex = "\\w+@\\w+(\\.\\w+)+";//[email protected]		
		boolean b = mail.matches(regex);		
		System.out.println(mail+":"+b);		
	}

输出结果:

[email protected]:true

(4)网络爬虫

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * 网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。 
 * 
 * 爬取邮箱地址。 
 * 
 */
public class RegexTest2 {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {		
		List<String> list = getMailsByWeb();		
		for(String mail : list){
			System.out.println(mail);
		}
	}
	
	public static List<String> getMailsByWeb() throws IOException {		
		//1,读取源文件。
//				BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));		
		URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");		
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));				
		//2,对读取的数据进行规则的匹配。从中获取符合规则的数据.
		String mail_regex = "\\w+@\\w+(\\.\\w+)+";		
		List<String> list = new ArrayList<String>();		
		Pattern p = Pattern.compile(mail_regex);		
		String line = null;		
		while((line=bufIn.readLine())!=null){			
			Matcher m = p.matcher(line);
			while(m.find()){
				//3,将符合规则的数据存储到集合中。
				list.add(m.group());
			}			
		}
		return list;
	}

	public static List<String>  getMails() throws IOException{		
		//1,读取源文件。
		BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));		
		//2,对读取的数据进行规则的匹配。从中获取符合规则的数据.
		String mail_regex = "\\w+@\\w+(\\.\\w+)+";		
		List<String> list = new ArrayList<String>();		
		Pattern p = Pattern.compile(mail_regex);		
		String line = null;		
		while((line=bufr.readLine())!=null){			
			Matcher m = p.matcher(line);
			while(m.find()){
				//3,将符合规则的数据存储到集合中。
				list.add(m.group());
			}			
		}
		return list;		
	}
}

其中getMailsByWeb()方法指的是爬取网络上的邮箱账号,而getMails()指的是爬取本地文件里的邮箱账号。

视频资源

链接:https://pan.baidu.com/s/1nvKdzRz 密码:ucly







猜你喜欢

转载自blog.csdn.net/gislaozhang/article/details/78722293