理解正则表达式

来源:互联网 发布:吴淑娴 网络翻译 编辑:程序博客网 时间:2024/04/29 15:30
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