Java基础知识回顾--正则表达式

RegularExpressions
字符串处理利器

正则表达式语法
正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。
特殊字符
下表包含了单字符元字符的列表以及它们在正则表达式中的行为。
若要匹配这些特殊字符之一,必须首先转义字符,即,在字符前面加反斜杠字符 ()。 例如,若要搜索“+”文本字符,可使用表达式“+”。
这里写图片描述
这里写图片描述

元字符
下表包含了多字符元字符的列表以及它们在正则表达式中的行为。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

非打印字符
下表包含表示非打印字符的转义序列。
这里写图片描述

优先级顺序
正则表达式的计算方式与算术表达式非常类似;即从左到右进行计算,并遵循优先级顺序。
下表按从高到低的顺序包含了正则表达式运算符的优先级顺序。
这里写图片描述

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


public class Test {

    public static void main(String[] args) {
        //简单认识正则表达式的概念
        /*
        p("abc".matches("..."));
        //两个反斜杠d就是转义一个反斜杠d表示数字
        p("a8729a".replaceAll("\\d", "-"));
        Pattern p = Pattern.compile("[a-z]{3}");
        Matcher m = p.matcher("fgh");
        p(m.matches());
        p("fgha".matches("[a-z]{3}"));
        */

        //初步认识. * + ? 
        // * 零个或多个字符
        // + 一个或多个字符
        // ? 一个或零个
        /*
        p("a".matches("."));
        p("aa".matches("aa"));
        p("aaaa".matches("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("a".matches("[abc]"));
        //取非
        p("a".matches("[^abc]"));
        p("A".matches("[a-zA-Z]"));
        //底下两种都是或者
        p("A".matches("[a-z]|[A-Z]"));
        p("A".matches("[a-z[A-Z]]"));
        p("R".matches("[A-Z&&[RFG]]"));
        */

        //认识\s \w \d \
        /**
        * \s 所有的空白字符
        * \w 小写a-z和A-Z和下划线_和0-9,构成关键字的字符
        * \d 0-9
        **/
        /*
        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
        //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.*")); //true,\b是单词边界
        p("hellosir".matches("^h[a-z]{1,3}o\\b.*")); //false
        //whilte lines 空白行
        p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));

        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("asdfasdfsafsf@dsdfsdf.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));

        //matches 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());
        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.start() + "-" + m.end());找不到用这个就会报错
        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 JaVa IloveJAVA you hateJava afasdfasdf");
        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})"); //这个中间的两个小括号就是分组用的,分为两组
        String s = "123aa-34345bb-234cc-00";
        Matcher m = p.matcher(s);
        while(m.find()) {
            //p(m.group());
            p(m.group(1)); //分组输出,正则表达式中小括号分组
        }
        */

        //qulifiers 修订词
        /*
        Pattern p = Pattern.compile(".{3,10}+[0-9]");  //一下子吞最大的10个,然后发现不匹配吐出一个匹配
        //Pattern p = Pattern.compile(".{3,10}?[0-9]");  //这个加问号的就是不贪婪的,只读最少的就是aaaa5
        String s = "aaaa5bbbb68";
        Matcher m = p.matcher(s);
        if(m.find())
            p(m.start() + "-" + m.end());
        else 
            p("not match!");
        */

        //non-capturing groups 用得比较少,用的时候试一下
        /*
        Pattern p = Pattern.compile(".{3}(?=a)");
        String s = "444a66b";
        Matcher m = p.matcher(s);
        while(m.find()) {
            p(m.group());
        }
        */

        //back refenrences 向前引用
        /*
        Pattern p = Pattern.compile("(\\d(\\d))\\2");
        String s = "122";
        Matcher m = p.matcher(s);
        p(m.matches());
        */

        //flags的简写
        //Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        p("Java".matches("(?i)(java)"));
    }

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

}

上述代码又看不懂的这有图片解释
这里写图片描述
这里写图片描述
这里写图片描述

下面贴出网页中抓取邮件的小例子。

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:\\share\\courseware\\1043633.html"));
            String line = "";
            while((line=br.readLine()) != null) {
                parse(line);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    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());
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值