整理正则表达式

引言:基本不怎么使用正则表达式,以至于每次使用时都忘记各符号含义及用法,所以记录下,供快速参考用。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
	
	public static void p(Object o){
		System.out.println(o);
	}

	public static void main(String[] args) {
		
		/**
		 * 简单认识正则表达式
		 */
		p("abc".matches("..."));
		p("a8729a".replaceAll("\\d", "-"));
		Pattern p = Pattern.compile("[a-z]{3}");//创建一个编辑好的模式
		Matcher m = p.matcher("fgh");//用模式匹配去字符串,匹配后的结果保存在匹配器里
		p(m.matches());//true
		
		p("fgh".matches("[a-z]{3}"));//更方便写法,用字符串的matches()方法直接去匹配正则.由于使用时临时编译,所以速度慢
		
		
		/**
		 * 认识. * + ?
		 * 
		 * .代表一个任意字符
		 * *代表0个或多个字符
		 * +代表1个或多个字符
		 * ?代表0个或1个字符
		 */
		p("a".matches("."));//true
		p("aa".matches("aa"));//true
		p("aaaa".matches("a*"));//true
		p("aaaa".matches("a+"));//true
		p("".matches("a*"));//true
		p("aaaa".matches("a?"));//false
		p("".matches("a?"));//true
		p("a".matches("a?"));//true
		p("4354654545".matches("\\d{3,100}"));//true
		p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//false
		p("192".matches("[0-2][0-9][0-9]"));//true
		
		
		/**
		 * 范围
		 * 
		 * []用来匹配一个字符
		 * ^放[]里代表取反,放[]外代表以某字符开头
		 */
		p("a".matches("[abc]"));//true
		p("a".matches("[^abc]"));//false
		p("A".matches("[a-zA-Z]"));//true
		p("A".matches("[a-z]|[A-Z]"));//true
		p("A".matches("[a-z[A-Z]]"));//true
		p("R".matches("[A-Z&&[RFG]]"));//true
        
		
		/**
		 * 认识\s \w \d \
		 * 
		 * \s代表任意空白字符
		 * \w代表任意英文符号 包括数字、字母、下划线
		 * \d代表任意数字
		 */
		p(" \n\r\t".matches("\\s{4}"));//true
		p(" ".matches("\\S"));//false
		p("a_8".matches("\\w{3}"));//true
		p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));//true
		p("\\".matches("\\\\"));//true
		
		
		/**
		 * 边界^ $ \b
		 * 
		 * ^在[]外代表以某字符串开头
		 * $代表以某字符串结尾
		 * \b代表单词边界
		 */
		p("hello sir".matches("^h.*"));//true
		p("hello sir".matches(".*ir{1}quot;));//true
		p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//true
		p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));//false
		//whilte lines
        p(" \n".matches("^[\\s&&[^\\n]]*\\n{1}quot;));//true 0个或多个"空白字符并且非换行符"开头,换行符结束
        
        p("aaa 8888c".matches(".*\\d{4}."));//true
        p("aaa 8888c".matches(".*\\b\\d{4}."));//true
        p("aaa8888c".matches(".*\\d{4}."));//true
        p("aaa8888c".matches(".*\\b\\d{4}."));//false
        
		
		//Email
		p("java_ztx@126.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));
		
		
		/**
		 * matches find lookingAt
		 * find依次往下查找是否匹配
		 * lookingAt每次都从头查找是否匹配
		 */
		Pattern p = Pattern.compile("\\d{3,5}");
		String s = "123-34345-234-00";
		Matcher m = p.matcher(s);
		p(m.matches());
		m.reset();
		
		p(m.find());//true
		p(m.start()+"-"+m.end());
		p(m.find());//true
		p(m.start()+"-"+m.end());
		p(m.find());//true
		p(m.start()+"-"+m.end());
		p(m.find());//false
		//p(m.start()+"-"+m.end());
		
		p(m.lookingAt());//true
		p(m.lookingAt());//true
		p(m.lookingAt());//true
		p(m.lookingAt());//true
		
		
		/**
		 * 替换
		 */
		Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afdafgeerdg");
		p(m.replaceAll("JAVA"));
		m.reset();
		StringBuffer sb = new StringBuffer();
		int i = 0;//奇、偶控制
		while (m.find()) {
			i++;
			if(i%2 == 0){//偶
				m.appendReplacement(sb,"java");
			} else {//奇
				m.appendReplacement(sb, "JAVA");
			}
		}
		m.appendTail(sb);//添加尾巴
		p(sb);//JAVA java JAVA java IloveJAVA you hatejava afdafgeerdg
		
		
		/**
		 * 组
		 * 一个()代表一个组
		 * group()打印匹配的字符串
		 */
		Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");
		String s = "123aa-34345bb-234cc-00";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group(1));//打印匹配的123aa字符串里的第一组,即123
		}
		
	}
	
}


做个练习:某网页另存为保存到本地磁盘后,抠出里面所有的Email

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailSpider {
	
	public static void main(String[] args){
		try {
			BufferedReader br = new BufferedReader(new FileReader("D:\\test.html"));
			String line = "";
			while ((line = br.readLine()) != null) {
				parse(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch(IOException e){
			e.printStackTrace();
		}
	}
	
	public static void parse(String line){
		Pattern p = Pattern.compile("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+");
		Matcher m = p.matcher(line);
		while (m.find()) {
			System.out.println(m.group());
		}
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值