zoukankan      html  css  js  c++  java
  • 正则表达式练习

    正则表达式的初步小练习 和 一个抓取网页邮箱的例子

    1.小练习

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class test {
    
    	public static void main(String[] args) {
    		/*// 简单认识正则表达式
    		//一个点代表一个字符,判断是否符合这种格式
    		p("abc".matches("..."));
    		p("a8729a".replaceAll("\d", "-"));
    		//定义一个正则表达式模式,并且编译,在以后的开发中可以加快速度
    		Pattern p = Pattern.compile("[a-z]{3}");
    		//给要检查的字符序列与正则表达式比较的结果定义为matcher
    		Matcher m = p.matcher("fgh");
    		p(m.matches());
    		p("fgh".matches("[a-z]{3}"));*/
    		
    		/*//初步认识 . * + ?
    		p("a".matches("."));//.代表任意一个字符
    		p("aa".matches("aa"));//只要求首字母和第二个字母匹配,后面的不管
    		p("aaaa".matches("a*"));//*代表0个或者多个
    		p("aaaa".matches("a+"));//+代表一个或者多个
    		p("".matches("a?"));//?代表一个或者0个
    		p("".matches("a*"));
    		p("aaaa".matches("a?"));
    		p("a".matches("a?"));
    		p("214523145234532".matches("\d{3,100}"));//至少出现3次,最多不超过100次
    		p("127.0.0.aaa".matches("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\."));
    		p("192".matches("[0-2][0-9][0-9]"));*/
    		
    		/*//范围
    		p("a".matches("[abc]"));//取中括号中的诸多值的一个
    		p("a".matches("[^abc]"));//取中括号里面值之外的其他值 ^代表取反
    		p("A".matches("[a-zA-Z]"));//取a-z或者A-Z之间的某一个
    		p("A".matches("[a-z]|[A-Z]"));//取a-z或者A-Z之间的某一个  并集
    		p("A".matches("[a-z[A-Z]]"));//取a-z或者A-Z之间的某一个
    		p("R".matches("[A-Z&&[RFG]]"));//取A-Z之间的某一个值并且还得是RFG三个中的一个  交集*/		
    		/*//认识d s w
    		p("
    
    	".matches("\s{4}"));//s代表空白字符
    		p(" ".matches("\S"));
    		p("a_8".matches("\w{3}"));//w代表构成单词的字符
    		p("abc888&^%".matches("[a-z]{1,3}\d+[&^#%]+"));
    		p("\".matches("\\"));//java里面正则表达式用四个反斜线来表示一个正常的反斜线*/		
    		
    		//POSIX Style  POSIX是UNIX操作系统的一种标准
    		//p("a".matches("\p{Lower}"));
    		
    		/*//boundary 开头和结尾的匹配
    		//^代表一行的开头
    		p("hello sir".matches("^h.*"));
    		//$一行的结尾
    		p("hello sir".matches(".*ir$"));
    		//单词边界
    		p("hello sir".matches("^h[a-z]{1,3}o\b.*"));
    		p("hellosir".matches("^h[a-z]{1,3}o\b.*"));*/
    		
    		/*//white lines 空白行
    		//统计空白行 " 
    "代表空白行  以空白字符打头但不是回车同时以换行作为结尾
    		p(" 
    ".matches("^[\s&&[^\n]]*\n$"));*/
    		
    		/*//test
    		p("aaa 8888c".matches(".*\d{4}."));
    		p("aaa 8888c".matches(".*\b\d{4}."));
    		p("aaa8888c".matches(".*\d{4}."));
    		p("aaa8888c".matches(".*\b\d{4}."));*/
    		
    		//email
    		/*p("dsafdsfafdsa@dsadf.com".matches("\w[.-]+@[\w[.-]]+\.[\w]+"*/
    		
    		
    		/*//matches find lookingAt
    		
    		Pattern p = Pattern.compile("\d{3,5}");
    		String s = "123-2345-234-00";
    		Matcher m = p.matcher(s);
    		//matches每次找到的都是整个串
    		p(m.matches());
    		m.reset();*/
    		
    		/*//从剩余的字符串中进行查找 find用于查找字串
    		//若没有reset下面的find会受matches的影响,从2345开始寻找
    		p(m.find());
    		//如果要输出开始位置和结束位置,前提是必须能够找到子串
    		p(m.start() + "-" + m.end());
    		p(m.find());
    		p(m.start() + "-" + m.end());
    		p(m.find());
    		p(m.start() + "-" + m.end());
    		p(m.find());
    		
    		
    		//每次从头开始找
    		p(m.lookingAt());
    		p(m.lookingAt());
    		p(m.lookingAt());
    		p(m.lookingAt());*/
    		
    		/*//replacement
    		Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
    		Matcher m = p.matcher("java Java JAVa IloveJaVa you hate jAva");
    		//p(m.replaceAll("JAVA"));
    		while(m.find()) {
    			//输出子串
    			p(m.group());
    		}
    		StringBuffer buf = new StringBuffer();
    		int i = 0;
    		while(m.find()) {
    			i++;
    			if(i%2 == 0) {
    				m.appendReplacement(buf, "java");
    			} else {
    				//单个字符串子串的替换
    				m.appendReplacement(buf, "JAVA");
    			}
    		}
    		//把剩余的字符也都加上,添加尾巴
    		m.appendTail(buf);
    		p(buf);*/
    		
    		/*//group
    		//Pattern p = Pattern.compile("\d{3,5}[a-z]{2}");
    		Pattern p = Pattern.compile("(\d{3,5})([a-z]{2})");
    		String s = "123aa-23234bb-234cc-00";
    		Matcher m = p.matcher(s);
    		while(m.find()) {
    			//在正则表达式中进行数据的分组,便于信息的提出
    			p(m.group(1));
    			p("   ");
    			p(m.group(2));
    		}*/
    		
    		/*//qulifiers 三种不同的形态 贪婪、不情愿、独占
    		//贪婪的,先整个吞进来再往外面吐
    		Pattern p = Pattern.compile("(.{3,10})[0-9]");
    		//不情愿的,从最前面开始吞,找找满足的之后就停下来了
    		//Pattern p = Pattern.compile("(.{3,10}?)[0-9]");
    		//独占,最多要几个就直接吞几个,再往外面吐,不满足就不往下寻找了
    		//Pattern p = Pattern.compile("(.{3,10}+)[0-9]");
    		String s = "aaaa5bbbb";
    		Matcher m = p.matcher(s);
    		if(m.find()) {
    			p(m.start() + "---" + m.end());
    		} else {
    			p("nor match!");
    		}*/
    		
    		
    		/*//back refenrences
    		//前面的两个整数作为一个组,1代表的意思是后来找到的必须和第一组是完全一致的
    		//Pattern p = Pattern.compile("(\d\d)\1");//false
    		//String s = "1234";
    		//第一个数为一个组,第二个数为一个组,2代表的含义是后面找到的数必须和第二组保持一致
    		Pattern p = Pattern.compile("(\d(\d))\2");
    		String s = "122";
    		Matcher m = p.matcher(s);
    		p(m.matches());*/
    		
    		
    		/*//flag的简写
    		Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//标志忽略大小写关系
    		p("Java".matches("(?i)(java)"));//(?i)表示打开标志位或者关闭标志位*/		
    		
    		
    		/*//non-capturing groups
    		//Pattern p = Pattern.compile(".{3}");
    		
    		//()里面以?开始不是代表一个组而是代表一个不捕获组,3个字符后面跟一个a,实际截取的只是前面三个字符
    		//Pattern p = Pattern.compile(".{3}(?=a)");
    		
    		//放在前面和放在后面不一样,表示以a打头三个字符,输出为a66。非捕获的意思,符合就捕获,不符合就不捕获
    		//Pattern p = Pattern.compile("(?=a).{3}");
    		
    		//不以a打头的三个字符,输出结果为444 66b
    		//Pattern p = Pattern.compile("(?!a).{3}");
    		
    		//不以以a为结尾的前面三个字符 输出结果为44a 66b
    		//Pattern p = Pattern.compile(".{3}(?!a)");
    		
    		//从后往前数第一个不是字符a的,包含最后一个本身 输出结果为444 a66
    		//Pattern p = Pattern.compile(".{3}(?<!a)");
    		
    		//从后往前数第一个是字符a的,包含最后一个本身 输出结果为44a
    		Pattern p = Pattern.compile(".{3}(?<=a)");
    		
    		String s = "444a66b";
    		Matcher m = p.matcher(s);
    		while(m.find()) {
    			p(m.group());
    		}*/
    		
    		
    	}
    	
    	
    	//简单化Syste.out.println
    	public static void p(Object o) {
    		System.out.println(o);
    	}
    
    }


    2.网页抓取邮箱

    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 testEmail {
    	//抓取网页邮箱代码
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new FileReader("E:\eclipse_code\RegExp\testEmail.html"));
    		String line = "";
    		while((line = br.readLine()) != null) {
    			parse(line);
    		}
    	}
    
    	private 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());
    		}
    	}
    }


  • 相关阅读:
    《挑战程序设计竞赛》 读后感
    基于SOAP的xml网络交互心得
    不用客户端,轻松下视频
    在cmd窗口中查询android的sqlite3数据库表之步骤
    单链表的插入删除以及逆转
    java中排序一个字符串数组
    求质因数
    指针与引用的区别
    统计查询-sql
    ---随心买统计查询
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776132.html
Copyright © 2011-2022 走看看