Java基礎—正則表達式

一、正則表達式概述
  正則表達式是一些符號一定規則的表達式,專門用於字符串操作,它是用一些特定的符號表示一些字符串操作代碼,簡化了字符串操作代碼,但閱讀性較若。
二、一些簡單的正則表達式
  1、字符類:
  [abc]      該位取值只能爲abc中的一個;
  [^abc]      該位取值爲除了abc以外的任意字符;
  [a-zA-Z]      該位的取值爲任意的大小字母;
  [a-d[m-p]]     該位的取值要麼a-d,要麼m-p;
  [a-g&&[e-k]]   該位的取值爲efghijk中的任一字符;
  2、預定義字符類:
  .      任一字符
  \d     數字[0-9];
  \D    非數字[^0-9];
  \s     空白字符:[ \t\n\x0B\f\r]
  \S     非空白字符[^\s];
  \w     [a-zA-Z0-9_];
  \W    [^\w]
  3、Greedy數量詞:
  X?      出現一次或一次都不出現;
  X*      出現零次或多次;
  X+       出現一次或多次;
  X{n}      恰好出現n次;
  X{n,}     至少出現n次;
  X{n,m}    至少出現n次,最多出現m次。
三、基本的操作
  1、匹配:用於判斷字符串是否合法(合法自己定義的)。代碼如下:

/*
1、驗證手機號是否合法,
   移動:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188

  聯通:130、131、132、152、155、156、185、186

  電信:133、153、180、189、(1349衛通)
 分析:
      有上面的數字可知,手機號位數爲11位,第一位只能爲1,第二位只能爲:3/5/8,
       其他的9位爲0-9。

2、驗證郵箱號是否合法,
   郵箱號規則:數字或字母@數字或字母.字母/數字或字母@數字或字母.字母.字母。
*/
class MatchesTest 
{
    //將打印語句封裝
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {
        checkTel("15559889951");
        checkMail("[email protected]");
    }
    //校驗手機號是否符合規定
    public static void checkTel(String tel)
    {
        //定義規則
        String regex = "[1][358]\\d{9}";
        //校驗
        boolean flag = tel.matches(regex);
        //根據校驗結果輸出相應的語句
        if(!flag)
            sop("手機號錯誤,請重新輸入!");
        else
            sop("手機號碼正確!");
    }
    //校驗郵箱號是否符合規定
    public static void checkMail(String mail)
    {
        //定義規則
        String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
        //調用maches方法校驗
        boolean flag = mail.matches(regex);
        //根據校驗結果輸出相應的語句
        if(flag)
            sop("郵箱號是正確的的");
        else
            sop("郵箱號不符合規範,請重新輸入!");
    }
}

  2、替換:將一個字符串轉換成另一個字符串,將符合規則的字符串替換成指定的字符串。代碼如下:

/*
  "我我...我我...我要..要要...要要...學學學...學學...編編編...編程..程.程程...程...程"
  將該字符串轉換成:"我要學編程"

  分析:
       將一個字符串轉換成另一個字符串,應該用替換;

  步驟:
       1、將"."去掉;
       2、將疊詞換成一個字。

  其他說明:
           爲了能使規則的結果可以被重用,可以將規則封裝,用"()"完成,組的出現都有編號,
           從1開始,可以通過\1的方式獲取元素。一個規則中有幾組:看"(",規則的編號從左
           往右數:"("。在規則內獲取:\1,在規則外獲取:$1.
*/
class ReplaceAllTest
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {
        String str = "我我...我我...我要..要要...要要...學學學...學學...編編編...編程..程.程程...程...程";
        sop("原字符串:"+str);
        //去除"."
        str = str.replace(".","");
        sop("去除“.”後的字符串:"+str);
        //將疊詞轉換爲一個字
        str = str.replaceAll("(.)\\1+","$1");
        //在規則內獲取組元素:\n
        //在規則外獲取族元素:$1
        sop("最終的字符串:"+str);
    }
}

  3、切割:將字符串按照一定的規則切割成多條字符串,符合規則的丟掉。代碼如下:

/*
1、按.切割;
2、按\切割;
3、按疊詞切割。
*/
import java.util.*;
class SplitTest
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {
        sop("按.切割字符串-------");
        split1("zhangsan.lisi.jiandan.xiaxia.jingjing.xiaoxue.xiaoxiao");
        sop("按\\切割字符串-------");
        split2("C:\\Users\\cecy\\Desktop\\javastudy\\javacode\\day25\\SplitTest.java");
        sop("按疊詞切割字符串-------");
        split3("hahaccccccheiheieeheheiiihiahiabbbbbbbxixixxxxhiehie");
    }
    //按.切割
    public static void split1(String str)
    {
        //定義規則
        String regex = "\\.";
        //切割字符串
        String[] strs = str.split(regex);
        //定義一個集合,用於裝字符串對象
        ArrayList<String> al = new ArrayList<String>();
        //用Arrays對數組進行排序
        //Arrays.sort(strs);
        //將字符串取出並存入集合
        for(String s : strs)
        {
            al.add(s);
            //sop(s);
        }
        //用Collections的sort方法對List集合進行排序
        Collections.sort(al);
        //用高級for將集合輸出
        for(String name : al)
        {
            sop(name);
        }
    }
    //按\切割
    public static void split2(String str)
    {
        //定義規則
        String regex = "\\\\";
        //切割字符串
        String[] strs = str.split(regex);
        //將切割結果打印
        for(String path : strs)
        {
            sop(path);
        }
    }
    //按疊詞切割
    public static void split3(String str)
    {
        //定義規則
        String regex = "(.)\\1+";
        //切割字符串
        String[] strs = str.split(regex);
        //將切割結果打印
        for(String s : strs)
        {
            sop(s);
        }
    }
}

4、獲取:將符合規則的字符串取出。

/*
 "ming tian jiu yao fang jia le,tong xue men!"
 取出上述只有三個字母組成的單詞。
*/
import java.util.regex.*;
class MatcherTest 
{
    public static void main(String[] args) 
    {
        String str = "ming tian jiu yao fang jia le,tong xue men!";
        //定義規則
        String regex = "\\b[a-z]{3}\\b";
        //將規則封裝成Pattern對象
        Pattern p = Pattern.compile(regex);
        //將規則對象及要操作的字符串相關聯
        Matcher m = p.matcher(str);
        //查找符合規則的字符串並將其取出
        while(m.find())
        {
            System.out.println(m.group());
            System.out.println(m.start()+"---"+m.end());
        }
    }
}

5、練習——ip地址排序

/*
    192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
    將ip地址進行地址段順序的排序。

    分析:簡單的排序方法有三種:1、Arrays.sort();2、存儲到TreeSet中(沒有重複元素);
                                3、存儲到List集合中,再用Collections中的sort()方法。
    排序之前,ip地址的每段的位數要一致,不然排序出來的不符合實際。

    步驟:
         1、將ip地址段都轉換成3位數;
         2、再將字符串切割;
         3、將每個ip地址存入到TreeSet中;
         4、將ip地址打印,查看是否排序正確。

    規則說明:
            ([0-9]+):0-9的數出現一次或出現多次,並將該數封裝進組,以便調用;
            0*([0-9]{3}):0出現零次或多次,0-9出現三次,並將0-9出現三次的數字封裝進組,以便再次引用。
            0*([0-9]{1,3}):0出現零次或多次,0-9至少出現一次,最多出現3次,並將其封裝進組,以便再次引用。

   其他說明:用到的類:TreeSet、Iterator、String
             用到的方法:TreeSet(iterator、add)
                         Iterator(hasNext、next)
                         String(replaceAll、split)
*/
import java.util.*;
class IpTest
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {
        String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
        sop("原ip字符串:"+ip);
        //在ip地址每段前加00
        ip = ip.replaceAll("([0-9]+)","00$1");
        sop("在每段ip地址前加00後:"+ip);
        //每段ip地址保留後三位
        ip = ip.replaceAll("0*([0-9]{3})","$1");
        sop("保留每個ip段的後三位:"+ip);
        //切割字符串,獲取ip
        String[] ips = ip.split(" +");
        //定義一個集合存放ip地址並對其進行排序
        TreeSet<String> ts = new TreeSet<String>();
        for(String i : ips)
        {
            ts.add(i);
        }
        //將ip地址取出
        Iterator<String> it = ts.iterator();
        while(it.hasNext())
        {
            sop(it.next().replaceAll("0*([0-9]{1,3})","$1"));
        }
    }
}

6、練習——網頁爬蟲

/*
 網頁爬蟲:獲取郵箱地址。
 分析:
      獲取網頁文件中的郵箱號碼,先獲取網頁文件,再按照規則獲取郵箱。
 步驟:
      1、建立讀取流,並與文件相關聯;
      2、定義規則;
      3、將規則封裝成Pattern對象;
      4、將規則對象和讀取的網頁文件相關聯;
      5、查找符合規則的字符串並將其取出。
*/
import java.io.*;
import java.util.regex.*;
class WebCrawlerTest  
{
    public static void main(String[] args) 
    {
        BufferedReader bufr = null;
        try
        {
            //讀取網頁文件
            bufr  = new BufferedReader(new FileReader("C:\\Users\\cecy\\Desktop\\javastudy\\boke\\mail.txt"));
            String line = null;
            while((line = bufr.readLine()) != null)
            {
                //定義規則
                String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
                //將規則封裝成對象
                Pattern p = Pattern.compile(regex);
                //將規則對象和要操作的字符串相關聯
                Matcher m = p.matcher(line);
                //查找符合規則的字符串並取出
                while(m.find())
                {
                    System.out.println(m.group());
                }
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException("文件讀取失敗");
        }

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