首页 > 代码库 > java使用正则表达式

java使用正则表达式

package com.regexp;

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

public class Test {

    public static void main(String[] args) {
        //正则表达式
        //一个 "." 代表一个任意字符
        
        p("abc".matches("..."));
        //"\d"代表一个数字, \D相当于不是数字, 对\d取反
        p("as897as98fsg6dfg9sddf".replaceAll("\\d", "_"));
        //Pattern可以编译正则表达式的一个模式
        Pattern p = Pattern.compile("[a-z]{3}");
        Matcher m = p.matcher("erf");
        p(m.matches());//matches()方法永远是匹配整个字符串
        //以上三行代码相当于下面这一句, 但是上面三句性能比较高
        //{n}, 一定出现n次
        //{n,}, 至少出现n次, 最多不限
        //{n,m}, 至少出现n次, 不超过m次
        p("qqq".matches("[a-z]{3}"));
        
        //初步认识".", "*", "+", "?" MataData(源数据)
        p("a".matches("."));//一个任意字符
        p("aa".matches("aa"));
        p("aaaa".matches("a*"));//0个或多个
        p("aaaa".matches("a+"));//1个或多个
        p("aaaa".matches("a?"));//1个或不存在
        p("".matches("a?"));//零宽度匹配
        p("a".matches("a?"));
        p("45913549872168435".matches("\\d{3,10}"));
        p("192.168.0.222".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("l".matches("[^abc]"));//"^"除了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]]"));//同事满足两个范围        
        
        //认识\d \s \\u \
        p(" \n\t\r".matches("\\s{4}"));//"\s"是空白字符, 比如空格, 换行符, 制表符等
        p("发".matches("\\S{1,8}"));//"\S"是对"\s"的取反
        p("a_8".matches("\\w{3}"));//"\w"指的可以用作命名的字符:大小写字母下划线+数字
        p("abc807$%".matches("[a-z]{1,3}\\d+[&^%$]+"));
        p("\\".matches("\\\\"));
        
        //边界匹配器
        p("hello sir".matches("^h.*"));//"^"在"[]"外面的时候代表的是一行的开始
        p("hello sir".matches(".*ir$"));//"$"放在最后代表的是一行的结束
        p("hello#sir".matches("^h[a-z]{3}o\\b.*"));//"\b"单词边界可以包括那些空白字符或者"\W"等
        p("hellosir".matches("^h[a-z]{3}o\\b.*"));
        
        //过滤空白行("*"是用来修饰"^[\\s&&[^\\n]")
        p("  \t \n".matches("^[\\s&&[^\\n]]*\\n$"));
        
        //Email地址
        p("sdtght-@ryhrtbrebgr.com".matches("[\\w[.-]]+@[\\w[.-]]+.[\\w]+"));
        
        //matches.find()方法是查找字符串中符合正则表达式的子字符串
        //正则表达式的搜索引擎需要注意的一点
        Pattern p1 = Pattern.compile("\\d{3,5}");
        String s = "123-4567-8912-12345-ac";
        p("字符串的总长度: "+s.length());
        Matcher m1 = p1.matcher(s);
        p(m1.matches());
        //当执行完上面一行代码, 正则表达式引擎已经将String s匹配完了, 后面的几个find()方法是从"4567..."开始找的
        //也就是说find()方法和matches()是相互影响的
        m1.reset();//调用reset()方法可以解决find和matches相互影响
        p(m1.find());
        p(m1.start()+"----------"+m1.end());
        p(m1.find());
        p(m1.start()+"----------"+m1.end());
        p(m1.find());
        p(m1.start()+"----------"+m1.end());
        p(m1.find());
        p(m1.start()+"----------"+m1.end());
        p(m1.find());
        //如果想要输出找到的子字符串的位置, 前提是必须要能找到, 否则再执行下面这行代码就会报错 !
        p(m1.start()+"----------"+m1.end());
        
        //lookingAt()方法是从整个字符串的开始位置去查找
        p(m1.lookingAt());
        p(m1.lookingAt());
        p(m1.lookingAt());
        p(m1.lookingAt());
        
        //简单做个练习, 找出所有的网址
        String news = "民生在勤,勤则不匮www.baidu.com——习大大曾用2000多年前《左传》中的古语阐www.sina.com.cn释最朴实的道理。"
                + "2013spring.io年4月28日,"
                + "习大大在全国总工会机关同全国www.qq.com劳动模范代表座谈时强调,"
                + "必须牢固树立www.hanqi.net劳动最光荣、劳动最崇高、劳动最伟大、劳动最美丽的观念,崇尚劳动,造福劳动者,"
                + "让全体人民进一步焕发劳动热情、释放创造news.ifeng.com潜能,通过劳动创造更加美好的生活。";
        
        System.out.println(news);
        
        Pattern p2 = Pattern.compile("[[a-z][.]]+[\\w]+");
        Matcher m2 = p2.matcher(news);
        while(m2.find()) {
            //p(news.substring(m2.start(), m2.end()));
            p(m2.group());
        }
        
        //字符串的替换
        //Pattern.CASE_INSENSITIVE(Pattern里面的一个常量, 忽略大小写)
        Pattern p3 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        String s1 = "java Java jaVA JAVA jaVa i like jAva qwert";
        Matcher m3 = p3.matcher(s1);
        int b=0;
        StringBuffer buf = new StringBuffer();
        while(m3.find()) {
            //replaceAll直接返回已经替换的整个字符串
            //p(m.replaceAll("java"));
            b++;
            //如果要把偶数位的java替换成小写, 奇数位的替换成大写
            if(b%2==0) {
                m3.appendReplacement(buf, "java");
            } else {
                m3.appendReplacement(buf, "JAVA");
            }
        }
        m.appendTail(buf);
        p(buf.toString());
    
        //正则表达式的分组
        //应用: 在下面的例子中, 如果想取出每一个匹配的字符串之后, 还想取出只是数字的字符串
        //    可以使用分组, 分组规则, 从左往右数第几个"(", 就是第几个分组
        Pattern p4 = Pattern.compile("((\\d{3,5})([a-z]{2}))");
        String s2 = "123av-4567aa-8912qq-12345vv-ac";
        Matcher m4 = p4.matcher(s2);
        while(m4.find()) {
            p(m4.group(3));
        }
    }
    
    public static void p(Object o) {
        System.out.println(o);
    }
}

 

java使用正则表达式