理解正则表达式

public static void main(String[] args) {
        //简单认识
        /**
        p("aa".matches("..."));//一个点就是一个字符。默认情况下.*中的.只能匹配出\n以外的字符,如果遇到要匹配的字符串包含回车换行符(多行),则正则表达式遇到换行符后会停止,导致包含回车换行符的串不能正确匹配,解决的办法是:
         1、使用Pattern和Matcher对象
         设置Pattern模式为:Pattern.DOTALL
         2、使用String.replaceAll()
         正则表达式写法:
         String reg = "(?s)'.*'";


        p("12313".matches("\\d{5}"));//一个\\d就代表一个数字。
        p("asdfasdf887sfa000asf".replaceAll("\\d","-"));

        Pattern p = Pattern.compile("[0-9]{3}");
        Matcher m = p.matcher("224998");//匹配之后,会存在一个Matcher中。

        while(m.find()) {
            System.out.println(m.group());
        }
         **/

        // 初步认识. * + ?
        /**
        p("a".matches("."));
        p("aa".matches("aa"));
        p("aaaaaa".matches("a*"));//0或者1次及以上
        p("aaa".matches("a+"));//至少出现1次
        p("aa".matches("a?"));//1个或者0个。
        p("".matches("a?"));//即a有可能不出现,或者出现1次。

        p("92834".matches("\\d{3,}"));//至少出现3次,没有上限;
        p("9888".matches("\\d{3,4}"));//至少出现3次数字,但是不能超过4个。
        p("127.0.0.1".matches("[1-9]{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//ip地址
        p("192".matches("[0-2][0-9][0-9]"));
         **/

        // 范围
        /*
        p("a".matches("[abc]"));
        p("abc".matches("[^abc]"));//小尖号在[]前面的话,说明是开头的意思。如果是在字符前,那就是取反。
        p("A".matches("[a-zA-Z0-9]"));
        p("A".matches("[a-z]|[A-Z]"));//a-z或者A-Z都行。另一种写法是:[a-z[A-Z]]
        p("R".matches("[a-z&&[RGB]]"));//a-z而且R\G\B三者之一;
        */


        // 认识\s \w \d \
        // \s 代表所有空格[ \t\n\x0B\f\r] 大写的\S代表\s的取反。其它的大写都同理。
        // \w 代表单词字符[a-zA-Z0-9_]
        // \d 代表数字 [0-9]
        /*
        p(" \t\n\r".matches("\\s{4}"));//四个空格符。(包含所有空格符)
        p(" ".matches("\\S"));//非空格
        p("8_9".matches("\\w{3}"));//3个字符
        p("abcsf231313&^%$$".matches("[a-z]+\\d+[&^%$]+"));
        p("\\".matches("\\\\"));

        */

        // POSIX class预定义的字符串
        // p("asdfsd".matches("\\p{Lower}*"));//代表[a-z]。还有其它的。比较方便,还有其它类型。

        // 边界 。开头^和结尾$  \\b代表是单词的边界(即空格什么的、换行、特殊字符等等)
        // p("hello".matches("^h[a-z]*o$"));

        // 空格([\s&&[^\n]]指的是空格但不是换行符)、以\n换行符结尾。
        // p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));

        /*
        //find and lookingAt(find是找符合正则表达式的子串,只要找到一个子串,查找引擎就会把原串已经找到的子串去掉。而matches是整体匹配)
        Pattern p = Pattern.compile("\\d{3,5}");
        String s = "123-32311-2343-00";
        Matcher m2 = p.matcher(s);
        m2.matches();//逻辑是一个字符一个字符进行匹配,匹配到123-时,就已经发现不满足\\d{3,5}这个要求了,但是已经匹配过的字符已经没有了。
        // 所以当m2.matches()后,已经只有32311-2343-00了。
        m2.reset();//通过这个方法可以实现查找引擎回归原始状态;
        m2.find(); // 先找第一个串;

        p(m2.start()+"-" + m2.end());//打印起始位置和结束位置;

        m2.find();// 再找第二个串;
        m2.find();//再找第三个串。。。。。

        m2.lookingAt();//意思是每次从字符串的开始位置的开始查找。
        **/

        //替换
        Pattern replace = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//不区分大小写的意思。
        String replaceStr = "lsdkfJava asfJAVA jAva bbb";
        Matcher replaceMatcher = replace.matcher(replaceStr);
        /*while(replaceMatcher.find()) {
            p(replaceMatcher.group());
        }*/
        //p(replaceMatcher.replaceAll("C++"));

        // 将字符串出现的偶数子串用大写替换。奇数用小写替换;利用replacement;
        StringBuffer buf = new StringBuffer();
        int i = 0 ;
        while (replaceMatcher.find()) {
            i++;
            if(i % 2 == 0){
                replaceMatcher.appendReplacement(buf, "JAVA");
            }else {
                replaceMatcher.appendReplacement(buf, "java");
            }
        }
        replaceMatcher.appendTail(buf); //如果不加这个方法,只到最后一个Java,后面的bbb就会不见了。
        p(buf.toString());

        // 分组。分组是用小括号包括的。如果要看几组,就看有几个小括号即可。

        // qulifiers限定语。比如有正则表达式:
        // (.{3,10})? 先吃进去3个,判断是否符合正则表达式,如果符合,则退出。如果没有,则继续向后找,直到找到为止。
        // (.{3,10})+ 先吃进去10个,判断是否符合正则表达式,如果符合,则退出。如果没有,则不再找,马上退出。

        nonCupturing();
    }

    private static void nonCupturing() {
        String regex = "(.{3})(?=a)";// 找3个字符,以a结尾的子串。上面有说,如果有小括号,那就是分组,
        // 但是这里有一种特殊情况是小括号里以问号开头,则是一种特殊的形式。

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher("33abb4");
        while (m.find()) {
            p(m.group());
        }
    }

    private static void black() {
        //向前引用:(//d//d)//1 其中//1表示找到2个数字,group1后面的数字要和group1一模一样。
        // (//d(//d))//2 其中//2表示group2后面的数字要和group2一模一样。

        // flags的简写 比如忽略大小写:(?i)(java)


    }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值