java泛型學習

        正則表達式定義了字符串的模式。可以用來搜索、編輯或處理文本。並不僅限於某一種語言,但是在每種語言中有細微的差別。這裏主要講java中的運用。

正則表達式:符合一定規則的表達式。
   作用:用於專門操作字符串。
   特點:用於一些特定的符號來表示一些代碼操作。這樣就簡化書寫。
   所以學習正則表達式,就是在學習一些特殊符號的使用。
   好處:可以簡化對字符串的複雜操作。
   弊端:符號定義越多,正則越長,閱讀性越差。

   具體操作功能:
   1,匹配:String  matches方法。用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false。
   2,切割:String split();
   3,替換:String replaceAll(regex,str);如果regex中有定義組,可以在第二參數中通過$符號獲取正則表達式中的已有的組。
   4,獲取:將字符串中的符合規則的子串取出。

一,元字符的介紹。

*

匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。

+

匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。

?

匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價於 {0,1}。

{n}

n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

{n,}

n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。

{n,m}

m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

?

當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜索的字符串,而默認的貪婪模式則儘可能多的匹配所搜索的字符串。例如,對於字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

.

匹配除換行符(\n、\r)之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用像"(.|\n)"的模式。

x|y

匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。

[xyz]

字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz]

負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

[a-z]

字符範圍。匹配指定範圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字符。

[^a-z]

負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 範圍內的任意字符。

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B

匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

\d

匹配一個數字字符。等價於 [0-9]。

\D

匹配一個非數字字符。等價於 [^0-9]。

\w

匹配字母、數字、下劃線。等價於'[A-Za-z0-9_]'。

\W

匹配非字母、數字、下劃線。等價於 '[^A-Za-z0-9_]'。

所有的元字符(有些不是特別常用的上面沒有提到)都是特殊字符,使用的時候,都要用轉義字符轉義,即家 \ ,比如 . 就應該是\.  比如+ 就應該是 \+ 。而在java中,字符串裏面 \ 是需要用轉義字符在轉一次的。所以. 就應該是\\.   +就應該是 \\+ 。

 

二,具體的操作。

1,匹配。

 /**
     * 匹配
     */
    public static void check(String string, String regexp) {
        boolean matches = string.matches(regexp);
        System.out.println(matches);
    }

//----------------------------匹配------------------------------------
        check("823654785", "[1-9]\\d{5,11}");//檢測qq,要求qq6-12位,第一個數字不爲0
        /*解釋: [1-9]匹配的是一個1-9的數字         \\d{5,11}匹配的是每位都是由0-9組成的數字,這個數字最少5位,最多11位*/

        check("13531614727", "1[3578]\\d{9}");//檢測手機號碼,13****     15*****      17*****     18*****
        /*解釋: 1匹配1         [3578]匹配的是一位數字,數字可能是3,5,7,8         \\d{9}匹配的是每位都是由0-9組成的數字,這個數字9位*/

        //爲了可以讓規則的結果被重用,可以將規則封裝成一個組。用()完成。
        check("[email protected]", "\\w+@\\w+(\\.\\w+)+");//檢測郵箱 [email protected]  [email protected]
        /* 解釋:\\w+ 匹配一段[a-zA-Z0-9_]的字符串,字符串的位數至少1個          @匹配@         \\w+ 匹配一段[a-zA-Z0-9_]的字符串,字符串的位數至少1個           \\. 匹配 .
                \\w+ 匹配一段[a-zA-Z0-9_]的字符串,字符串的位數至少1個       (\\.\\w+)將\\.和\\w+包裝成一個組,裏面的內容表示一個點加一個字符串,字符串要求滿足[a-zA-Z0-9_],且至少一位
                (\\.\\w+)+滿足這個組的需求的至少1個 */

2,切割

/**
     * 切割
     */
    public static void split(String string, String regexp) {
        String[] split = string.split(regexp);
        for (String s : split) {
            System.out.println(" s  = " + s);
        }
    }
//----------------------------切割-----------------------------------
        split("zhangsan.lisi.wangwu.zhouliu", "\\.");//將字符串按照 . 切割成幾個名字
        /*  解釋: 因爲 . 是元字符,所以需要轉義用 \. ,又因爲在字符串中\要用\\來轉義,所以要用\\.來表示 .     */

        split("D:\\學習視頻\\黑馬程序員_畢向東_正則\\day25", "\\\\");//將字符串按照 \\ 切割成幾個小字符串
         /*  解釋: 因爲\\在字符串中需要轉義,所以是 \\\\    */

        //爲了可以讓規則的結果被重用,可以將規則封裝成一個組。用()完成。組的出現都有編號。從1開始。 想要使用已有的組可以通過  \n(n就是組的編號)的形式來獲取。
        split("erkktyqqquizzzzzofeweweegfrf", "(.)\\1+");//按照疊詞完成切割
         /*  解釋: (.)匹配任意字符,將匹配結果封裝成組。  (.)\\1+ 括號內絲組裝好的匹配,//1是表示第一組,+ 表示出現至少一次       */

        split("ddqw  ddqw  dwrwre rfrwe    fwew    wedfs   dqede  ", " +");//按照空格完成切割,注意其中空格不一定是一個,也可能是多個
        /*  解釋:     " +" 空格出現一次或多次   */

3,替換

/**
     * 替換
     */
    public static void replaceAll(String string, String regexp, String newstr) {
        String s = string.replaceAll(regexp, newstr);
        System.out.println("替換之後結果是 = " + s);
    }
//----------------------------替換-----------------------------------
        replaceAll("wer1389980000ty1234564uiod2334345675f", "\\d+", "#");//將數字中的字符串替換成#
        replaceAll("wer1389980000ty1234564uiod2334345675f", "\\d+", "\\+");//將數字中的字符串替換成$  因爲$是特殊字符,所以需要轉義
        replaceAll("gaoolonggxiaaopenggggyouuu", "(.)\\1+", "$1");//將重疊的字符替換成單個字母。eg:zzzz->z

4,獲取

    /*
        獲取:將字符串中的符合規則的子串取出。

        操作步驟:
            1,將正則表達式封裝成對象。
            2,讓正則對象和要操作的字符串相關聯。
            3,關聯後,獲取正則匹配引擎。
            4,通過引擎對符合規則的子串進行操作,比如取出。
    */
// "ming tian jiu yao fang jia le ,da jia。" 取出字符串中三個字母組成的單詞
    public static void main(String[] args) {
        String string = "ming tian jiu yao fang jia le ,da jia。";
        System.out.println("string = " + string);
        //  1,將正則表達式封裝成對象。
        Pattern pattern = Pattern.compile("\\b[a-z]{3}\\b");
        //2,讓正則對象和要作用的字符串相關聯。獲取匹配器對象。
        Matcher matcher = pattern.matcher(string);

        while (matcher.find()) { //3,關聯後,獲取正則匹配引擎。移動下標
            String group = matcher.group();//獲取字符串
            System.out.println( group+"    "+matcher.start() + " ........ " + matcher.end());//獲取得到的字符串的開始和結束的下標
        }
    }

練習:

/**
     * 將下列字符串轉成:我要學編程.
     */
    public static void test1() {
        String str = "我我...我我...我要..要要...要要...學學學....學學...編編編...編程..程.程程...程...程";
        String replace = str.replaceAll("\\.", "");
        String s = replace.replaceAll("(.)\\1+", "$1");
        System.out.println("replace = " + replace);
        System.out.println("s = " + s);
    }

    /**
     * 192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30  將ip地址進行地址段順序的排序。
     */
    public static void test2() {
        String str = "192.68.1.254 102.49.23.013 10.0.10.10 2.2.2.2 8.109.90.30";
       //1,先在每段前面加兩個0
        String str1 = str.replaceAll("(\\d+)", "00$1");
        System.out.println("str1 = "+str1);
        //2,將每段改成三位數
        String str2 = str1.replaceAll("0+(\\d{3})", "$1");
        System.out.println("str2 = "+str2);
        String[] split = str2.split(" +");
        Arrays.sort(split);
        StringBuffer sb = new StringBuffer();
        for (String s : split) {
            String newstr = s.replaceAll("0*(\\d+)", "$1");
           sb.append(newstr+" ");
        }
        System.out.println(sb.toString());
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章