正则表达式

正则表达式可以用来操作字符串数据,是通过一些特定的符号来体现的。

正则表达式的常见规则
 [abc] a、b或c(简单类)
 [^abc] 任何字符,除了abc
 [a-zA-Z] a到z或者A到Z
 [a-d[m-p]] a到d或者m到p
 [a-z&&[def]] a到z与def之间的交集。
 . 任何字符
 \d 数字[0-9]
 \D 非数字[^0-9]
 \s 空白字符
 \S 非空白字符
 \w 单词字符[a-zA-Z_0-9]表示大小写字母或下划线或数字
 \W 非单词字符
 
 ^ 行的开头
 $ 行的结尾
 \b 单词边界
  
 X? X,一次或者一次也没有(要么没有,要么有一次)
 X* X,零次或者多次(要么没有,要么有多次)
 X+ X,一次或多次
 X{n} 恰好n次。
 X{n,} 至少n次

 X{n,m} 至少n次,之多m次

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

	/*
	 * 演示获取
	 * 	将正则规则进行对象的封装。
	 * 	Pattern p = Pattern.compile("a*b");
	 *	//通过正则对象的macher方法字符串相关联,获取要对字符串操作的匹配器对象Macher.
	 *	Macher m = p.macher("aaaaab");
	 *	//通过Matcher匹配器对象的方法对字符串进行操作。
	 *	boolean b = m.maches();
	 *	
	 * 
	 */
	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对象的方法对字符串进行操作。
		//既然要获取三个字母组成的单词,就需要查找。
		
		System.out.println(str);
		while(m.find()){
			System.out.println(m.group());//获取匹配的子序列
			System.out.println(m.start() + ":" + m.end());//获取子序列在原序列中起始和终止的位置
		}
		
	}


	/*
	 * 演示替换
	 */
	public static void functionDemo_3() {
		String str = "xiaoqiangttttzhangsanbbbbblisi";
		
//		str = str.replaceAll("(.)\\1+", "#");//将所有的叠词都换成#
		str = str.replaceAll("(.)\\1+", "$1");//将叠词替换成单个的原来的字母,即将tttttt替换成t
											//$符号表示获取上一个正则表达式的符号。1表示上一个正则表达式的第一个元素。
		System.out.println(str);
		
		
		String tel = "15800001111";//实现将号码显示称为158****1111
		tel  = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
//		tel  = tel.replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1****$3");//组号按照左括号数,与上述语句实现相同的功能。
		System.out.println(tel);
		
		
	}

	/*
	 * 演示切割
	 * 组:(A(B(C))) 4组 	1(A(B(C)))	2\A	3(B(C))	4(C)
	 * 捕获组可以通过从左到右计算开括号来编号
	 * 组零始终代表整个表达式。
	 * 
	 * 
	 */
	public static void functionDemo_2() {
//		String str = "xiaoqiang     zhangsan   lisi";
//		String[] names = str.split(" +");
//		String str = "xiaoqiang.zhangsan.lisi";
//		String[] names = str.split("\\.+");//.是正则表达式中的特殊符号,需要进行转义\\.
		String str = "xiaoqiangttttzhangsanbbbbblisi";
		String[] names = str.split("(.)\\1+");//组,将.封装成组,即任意符号,组号为1,这组任意符号可以重复一次或者多次。(.)\\1+则表示叠词
		
		for(String name : names){
			System.out.println(name);
		}
	}
	
	
	
	/*
	 * 演示匹配
	 */
	public static void functionDemo_1() {
		//匹配手机号码是否正确。
		String tel = "15800001111";
//		String regex = "1[358][0-9]{9}";//范围用[]表征,次数用{}表征
		String regex = "1[358]\\d{9}";//"\\d"
		boolean b = tel.matches(regex);
		System.out.println(tel+":"+b);
	}

正则表达式的几个案例

/*
	 * 1,治口吃
	 */
	public static void test_1(){
		String str = "我我...我我我..我要要....要要要..要要学学学....学学....学学编编....编编编..编编编程程程...程程..程";
		//1,将字符串中的.去掉,用替换方法
		str = str.replaceAll("\\.+", "");
		//2,替换叠词
		str = str.replaceAll("(.)\\1+", "$1");
		System.out.println(str);
	}

/*
	 * 2、ip地址排序
	 * 192.168.10.33 127.0.0.1 105.70.11.55 3.3.3.3
	 */
	
	public static void test_2(){
		String ip_str = "192.168.10.33   127.0.0.1   105.70.11.55  3.3.3.3";
		//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);
		
		String[] ips = ip_str.split(" +");
		TreeSet<String> ts = new TreeSet<String>();
		for(String str :ips){
			ts.add(str);
		}
		
		for(String ip :ts){
			System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
		}
		
		
		
		//1 将ip地址切出
		/*String[] ips = ip_str.split(" +");
		TreeSet<String> ts = new TreeSet<String>();
		for(String str :ips){
			ts.add(str);
		}
		
		for(String ip :ts){
			System.out.println(ip);//按照字符串排序排序结果错误,因为ip地址的每一位的位数不同
		}*/
	}


/*
	 * 3,校验邮件地址
	 * 
	 * 
	 */
	
	public static void test_3() {
		String mail = "abc@sina.com";
		
		String regex = "[a-zA-z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{2,3})+";
		
		regex = "\\w+@\\w+(\\.\\w+)+";//笼统式匹配
		
		
		boolean b = mail.matches(regex);
		System.out.println(mail+":"+b);
	}

简单的网页爬虫案例(从网页html文件中爬邮箱地址):

	/*
	 * 从所给网址中找出邮箱,并存储在list中。
	 */
	public static List<String> getMailsByWeb() throws IOException {
		
		URL url = new URL("http://hao.360.cn/mkt.html");
		
		BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream()));
		
		//对读取到的数据进行规则匹配,从中获取符合规则的数据。
		String mail_regex = "\\w+@\\w+(\\.\\w+)+";
		
		List<String> list = new ArrayList<>();
		Pattern p = Pattern.compile(mail_regex);
		
		String line = null;
		while((line=bufr.readLine())!= null){
			Matcher m = p.matcher(line);
			
			if(m.find()){
				//3,将符合规则的数据存储到集合中。
				list.add(m.group());
			}
		}								
		return list;		
	}		
		

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值