java學習——《Regex》,java《Regex》

來源:互聯網
上載者:User

java學習——《Regex》,java《Regex》
Regex

一、有這麼一個需求,判斷一個qq號是否合法?它的長度只能在5-15位,並且只能是數字,0不能開頭,使用條件陳述式做判斷,可以這麼做

    /*     * 需求:校正qq號     * 要求:長度5-15;只能是數字;0不能開頭     */    public static void checkQQ(String qq){        int length=qq.length();        if(length>=5&&length<=15){            if (!qq.startsWith("0")) {                try {                    Long l=Long.parseLong(qq);                    System.out.println("正確!");                } catch (NumberFormatException e) {                    System.out.println(qq+":不是數字錯誤!");                }            }else {                System.out.println(qq+":0開頭錯誤!");            }        }else {            System.out.println(qq+":長度錯誤!");        }    }
View Code

在Regex面前,它顯然有些麻煩,但是它還是有優點就是易讀,很容易看懂代碼意思。

使用Regex,代碼就變成了

    public static void checkQQByRegex(String qq){        String regex="[1-9][0-9]{4,14}";        boolean b=qq.matches(regex);        System.out.println(qq+":"+b);    }
View Code

簡單的Regex,卻不容易讀懂,因此我們需要記很多符號代表的意思。

 

二、一些常用需要記憶的符號

字元類
[abc] a、b 或 c(簡單類)
[^abc] 任何字元,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(範圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](並集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
預定義字元類
. 任何字元(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空白字元:[^\s]
\w 單詞字元:[a-zA-Z_0-9]
\W 非單詞字元:[^\w]
邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超過 m

 

三、常用功能

  1、匹配:其實就是String類中matches方法

/*     * 匹配功能     * 需求:校正手機號     * 要求:11位,開頭13、15、18     */    public static void fun1() {        String phone="13511110000";        String regex="1[358]\\d{9}";//等同於String regex="1[358][0-9]{9}"        boolean b=phone.matches(regex);        System.out.println(phone+":"+b);    }
View Code

  2、替換:其實就是String類中replaceAll方法,不是replace方法

/*     * 替換功能     * 需求:將已知電話號碼,替換成形如152****0000     */    public static void fun3() {        String phone="15200001111";        String newPhone=phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");//$1取前一個運算式中第一組        System.out.println(newPhone);            }
View Code

  3、切割:其實就是String類中split方法

/*     * 切割功能     * 需求:從字串疊詞部分切割     */    public static void fun2() {        String s="張三@@@李四aaa王五";        String regex="(.)\\1+";//.任一字元,()組,\1取第一組,+至少出現一次        String strs[]=s.split(regex);        for (String string : strs) {            System.out.println(string);        }    }
View Code

  4、擷取:為了String類方便提供了上面方法,其實底層都是使用了Pattern類

    /*     * 擷取功能     * 需求:擷取“da jia hao,wo shi zhang san!”中三個字母組成的字串     */    public static void fun4() {        String s="da jia hao,wo shi zhang san!";        String regex="\\b[a-z]{3}\\b";//單詞邊界\b        Pattern p=Pattern.compile(regex);//將正則封裝成對象        Matcher m=p.matcher(s);//綁定字串擷取匹配器        //使用匹配器的find方法        while (m.find()) {//find 方法掃描輸入序列以尋找與該模式比對的下一個子序列。            System.out.println(m.group());//返回由以前匹配操作所匹配的輸入子序列。        }    }
View Code

四、練習

  1、治口吃

/*     * 需求:治口吃     */    public static void kouchi() {        String s="我我我我....要要要要要要...學學..加..瓦!";        //第一步替換...        String s2=s.replaceAll("\\.+", "");        //第二部替換疊詞        String s3=s2.replaceAll("(.)\\1+", "$1");        System.out.println(s3);    }
View Code

  2、對ip地址排序

    /*     * 需求:對ip地址進行排序     */    public static void ipSort() {        String s="192.168.0.1   127.0.0.1  133.1.1.1 88.0.192.1";        Set<String> set=new TreeSet<String>();//使用treeset排序的功能        //截取字串,放入set中,因為字元長度不同,所以排序失敗,所以需要補0        s=s.replaceAll("(\\d+)", "00$1");//00127.000.000.001        //保留3位元        s=s.replaceAll("\\d+(\\d{3})", "$1");//088.000.192.001        String strs[]=s.split(" +");        for (String string : strs) {            set.add(string);        }        for (String str : set) {            //去除0打頭和兩位0            str=str.replaceAll("0{1,2}(\\d+)", "$1");            System.out.println(str);        }    }
View Code

  3、對郵箱進行校正

/*     * 郵箱地址校正     */    public static void checkMail() {        String mail="zhangsan@sina.com.cn";        String regex="\\w+@\\w+(\\.\\w+)+";        boolean b=mail.matches(regex);        System.out.println(mail+":"+b);            }
View Code

  4、網頁爬蟲擷取郵箱

    /*     * 網頁爬蟲擷取郵箱     */    public static List<String> getMail(String addr) throws Exception {        URL url=new URL(addr);        BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));//擷取輸入資料流        Pattern p=Pattern.compile("\\w+@\\w+(\\.\\w+)+");//封裝        Matcher m=null;        String s=null;        List<String> mails=new ArrayList<String>();        while ((s=br.readLine())!=null) {            m=p.matcher(s);//綁定字串            while (m.find()) {                mails.add(m.group());            }        }        return mails;    }
View Code

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.