- package com.zhc.love;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class TestRegexp {
- /**
- * @param zhc
- * 和正则表达式有关系的类只有三个.java.lang.String.
- * java.util.regex.pattern
- * java.util.regex.Matcher
- */
- public static void main(String[] args) {
- // 正则表达式本身也是一个字符串
- //java.lang.String 的方法 boolean matches(String regex)
- //一个点代表一个字母,是否匹配三个字母
- System.out.println("aaa".matches("..."));
- //替换一个字符串中的数字 /d 代表数字
- p("ad87654aa".replaceAll("//d", "-"));
- //匹配三个从a-z的字母,先产生一个规则.储存在p对象中
- Pattern p = Pattern.compile("[a-z]{3}");
- //调用p对象的匹配方法,去跟字符处匹配,结果保留在m对象中
- Matcher m = p.matcher("aaaaa");
- //打印m,看字符串是不是匹配,返回boolean类型
- p(m.matches());
- //初步认识Regex
- //.表示一个字符 ;* 通配符,表示任意个字符 ;+ 表示出现一次或多次;?一次或者一次也没有
- //[]代表一个范围 [0-9]表示0-9的范围
- //{}表示出现的次数 {3} 出现3次
- p("a".matches("."));
- p("aa".matches("aa"));
- p("aaaa".matches("a*"));//a可以出现任意次
- p("aaaa".matches("a+"));
- p("".matches("a*"));
- p("aaaa".matches("a?"));
- p("".matches("a?"));
- p("a".matches("a?"));
- p("214523145234532".matches("//d{3,100}"));
- p("192.168.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("----------------------------------------");
- p("a".matches("[abc]"));//要匹配abc中的一个
- p("a".matches("[^abc]"));//取除了abc的任意字符
- p("A".matches("[a-zA-Z]"));//取大写或小写的字符
- p("A".matches("[a-z]|[A-Z]"));//a-z
- p("A".matches("[a-z[A-Z]]"));
- p("R".matches("[A-Z&&[RFG]]"));//取交集[A-Z和[RFG]]取交集做匹配准则
- //认识/s 表示空白字符 ;/w 单词字符:[a-zA-Z_0-9] /d ;数字:[0-9] ;/ 反斜线字符
- p("----------------------------------------");
- p(" /n/r/t".matches("//s{4}"));
- p(" ".matches("//S"));
- p("a_8".matches("//w{3}"));
- p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
- p("//".matches(""));
- //POSIX Style 用POSIX风格来指定规则,POSIX是unix的一种标准
- p("----------------------------------------");
- p("a".matches("//p{Lower}"));//相当于[a-z]
- //边界匹配boundary [^] 意思是取反.^意思是一行的开头
- p("----------------------------------------");
- 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.*"));
- //空白行的检测
- p("----------------------------------------");
- p(" /n".matches("^[//s&&[^//n]]*//n$"));
- //匹配emali地址的正则表达式
- p("----------------------------------------");
- p("aaa-aaa@aaa.com".matches("[//w.-]+@[//w*]+[.][//w*]+"));
- //matches find lookingAt matches匹配整个字符串 相当与c语言中的strtok方法
- //每次匹配完一次后,指针停留在匹配的最后一个字符串的位置上,必须reset下
- p("----------------------------------------");
- Pattern p1 = Pattern.compile("//d{3,5}");
- String s1 = "123-34345-234-00";
- Matcher m1 = p1.matcher(s1);
- p(m1.matches());
- p(m1.find());//找一个和整个模式相匹配的子串
- p(m1.find());//找一个和整个模式相匹配的子串
- p(m1.find());//最后匹配-00 ,已经不符合匹配规则
- p("----------------------------------------");
- Pattern p2 = Pattern.compile("//d{3,5}");
- String s2 = "123-34345-234-00";
- Matcher m2 = p2.matcher(s2);
- p(m2.matches());
- m2.reset();//把原来指针指向开头的地方
- p(m2.find());//找一个和整个模式相匹配的子串
- p(m2.find());//找一个和整个模式相匹配的子串
- p(m2.find());//找一个和整个模式相匹配的子串
- p(m2.find());//最后匹配-00 ,已经不符合匹配规则
- p("-----------------------------------------");
- Pattern p3 = Pattern.compile("//d{3,5}");
- String s3 = "123-34345-234-00";
- Matcher m3 = p1.matcher(s3);
- p(m3.lookingAt());//从开头开始匹配.匹配了则显示true
- p(m3.lookingAt());
- p(m3.lookingAt());
- p(m3.lookingAt());
- //Matcher的start()方法end()方法找到匹配字符串的指针的位置
- p("-----------------------------------------");
- Pattern p4 = Pattern.compile("//d{3,5}");
- String s4 = "123-34345-234-00";
- Matcher m4 = p4.matcher(s4);
- p(m4.matches());
- m4.reset();//把原来指针指向开头的地方
- p(m4.find());//找一个和整个模式相匹配的子串 0-3 第0个位置到指针的下一个开始的位置3
- p(m4.start() + "-" + m4.end());
- p(m4.find());//找一个和整个模式相匹配的子串
- p(m4.start() + "-" + m4.end());
- p(m4.find());//找一个和整个模式相匹配的子串
- p(m4.start() + "-" + m4.end());
- p(m4.find());//最后匹配-00 ,已经不符合匹配规则 如果找不到start会报错
- //字符串的替换replacement
- p("-----------------------------------------");
- //从指定的字符串找到规则中的字符串.打印出来 group() 找到跟规定字符串的字符串.把他放在一个"数组"里
- //Pattern p5 = Pattern.compile("java");
- Pattern p5 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//可以加一些修饰.这是忽略大小写
- Matcher m5 = p5.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
- //Matcher m5 = p5.matcher("java java java java java ");
- while(m5.find()){
- p(m5.group());
- }
- p("-----------------------------------------");
- Pattern p6 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//可以加一些修饰.这是忽略大小写
- Matcher m6 = p6.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
- while(m6.find()){
- p(m6.replaceAll("DUANJING"));
- }//把找到的字符串都替换成指定的字符串
- p("-----------------------------------------");
- //当偶数换成java 当奇数换成JAVA ,public Matcher appendReplacement(StringBuffer sb,String replacement)
- //将替换后的字符串保存在buf中,但是指针只指到替换的最后一个位置.得用appendTail(StringBuffer sb)
- //将字符串末尾添加到buf中
- Pattern p7 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//可以加一些修饰.这是忽略大小写
- Matcher m7 = p7.matcher("aaaa java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
- int i=0;
- StringBuffer buf = new StringBuffer();
- while(m7.find()){
- i++;
- if(i%2 == 0) {
- m7.appendReplacement(buf, "java");
- } else {
- m7.appendReplacement(buf, "JAVA");
- }
- }
- //m.appendTail(buf);
- p(buf);
- //正则表达式的分组 ()表示分组 ()的数量代表组的数量 每个组有自己的组号
- //m.group() 整个组 m.group()第一组 (是第几个就是第几组
- p("-----------------------------------------");
- Pattern p8 = Pattern.compile("(//d{3,5})([a-z]{2})");
- String s8 = "123aa-34345bb-234cc-00";
- Matcher m8 = p8.matcher(s8);
- while(m8.find()) {
- p(m8.group(2));//打印第二个分组 都字母的
- }
- }
- //重写System.out.println(o);方法
- public static void p(Object o){
- System.out.println(o);
- }
- }
- package com.zhc.love;
- 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 {
- /**
- * @by zhc
- * 从网页中抓取email地址
- */
- public static void main(String[] args) {
- //先把网页读取进来,用BufferReader 封装
- String line;
- BufferedReader br = null;
- try {
- br = new BufferedReader(new FileReader("D://workspace//RegExp//aaa.txt"));
- while((line=br.readLine())!=null){
- parse(line);
- }
- } catch (FileNotFoundException e) {
- System.out.println("文件没有找到!");
- } catch (IOException e) {
- System.out.println("读取文件错误!");
- }finally{
- if(br != null){
- try {
- br.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- //分析页面的email地址
- 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());
- }
- }
- }