2019-04-10

基于正則表達(dá)式詳解:

  • 1.專門用于操作字符串的技術(shù)
  • 2.而且可以簡(jiǎn)化代碼,用于對(duì)字符串進(jìn)行復(fù)雜操作
  • 3.通過(guò)一些符號(hào)的形式,簡(jiǎn)化了代碼的書(shū)寫,其實(shí)底層還是代碼
  • 弊端:符號(hào)太多,閱讀性差

正則對(duì)字符串的常見(jiàn)功能操作

  • 1.匹配
  • 2.切割
  • 3.替換
  • 4.獲取
package rejexMatches;

import java.util.Scanner;

/**
 *   1.1中括號(hào): [判斷字符位上的內(nèi)容]
 *    1.2預(yù)定義字符: 都帶有反斜線
 *   .  : 任意字符
 *   \d : 數(shù)字.  [0-9]
 *   \D :非數(shù)字  [^0-9]
 *   \w : 單詞字符 [a-z A-Z _0-9]
 * 1.3邊界字符
 *   ^ :行開(kāi)頭
 *   $ :行結(jié)尾
 *   \b : 單詞邊界
 * 1.4: 數(shù)量詞:必須結(jié)合內(nèi)容
 *   x? : x內(nèi)容出現(xiàn)零次或一次
 *   x* : x內(nèi)容出現(xiàn)零次或多次
 *   x+ : x內(nèi)容出現(xiàn)一次或多次
 *   x{n} :x內(nèi)容出現(xiàn)n次
 *   x{n,} : x內(nèi)容至少出現(xiàn)n次
 *   x{n,m} : x內(nèi)容出現(xiàn)n到m次
 */
public class Matches_demo {

    public static void main(String[] args) {

        Scanner scan=new Scanner(System.in);

while (true) {
    System.out.println("請(qǐng)輸入您的QQ號(hào):");
    String str = scan.nextLine();
    boolean b = str.matches("\\.+");
    if (b) {
        System.out.println(str+": 輸入的QQ號(hào)合法");
        break;
    }else
    System.out.println(str + ": 輸入的QQ號(hào)不和法,請(qǐng)重新輸入");
}
    }
}

后三種操作

package split_demo;

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


public class SplitDemoString {
    public static void main(String[] args) {
        String str = "huiehf....sud###suidh..frdgggg.gt.fdd.kkkuhgu..yfdgdtf";
        /*
        1.匹配(略)
         */
        /*
        2.切割
         */
        splitss(str);

        /*
        3.替換
         */
        replaceString(str);

        /*
        4.獲取
         */
        /**
         * Pattern對(duì)象的使用原理
         * 1.將正則表達(dá)式字符串編譯成正則對(duì)象
         * 2.通過(guò)Pattern對(duì)象獲取Matcher對(duì)象(匹配器對(duì)象)
         * 3.通過(guò)匹配器對(duì)象對(duì)字符串進(jìn)行規(guī)劃的匹配,結(jié)果都在匹配器當(dāng)中
         * 4.通過(guò)匹配器對(duì)象的功能獲取結(jié)果.
         */
        gets(str);
    }

    private static void gets(String str) {
        String sts = "di.shu.hi hd.hdd,iu ,gfu";
        String regex = "\\b[a-zA-Z]{3}\\b";

        //獲取正則表達(dá)式對(duì)象
        Pattern pt = Pattern.compile(regex);
        //通過(guò)正則表達(dá)式對(duì)象獲取適配器
        Matcher ms = pt.matcher(sts);

        //貌似像一個(gè)迭代器   這里是一個(gè)匹配器,如果找到匹配的就輸出,不能找到就繼續(xù)找下一個(gè),直到結(jié)束索引退出循環(huán)
        while (ms.find()) {
            System.out.println(ms.start() + "----" + ms.group() + "----" + ms.end());
            System.out.println(sts.substring(ms.start(), ms.end()));
        }

    }

    private static void replaceString(String str) {
        // String replace = str.replaceAll("(.)\\1+","&&");

        //在參數(shù)列表中,其他參數(shù)使用之前的參數(shù)中規(guī)則的組,需要使用&組編號(hào)
        //將多個(gè)重疊的字符濃縮為一個(gè)字符
//       String replace = str.replaceAll("(.)\\1+","$1");

        //電話號(hào)碼的隱藏,為了保證公布信息的正確性但是又維護(hù)個(gè)人信息的私密性,也就是防止被人打騷擾電話.
     /*   String ss="18569146418";
       String replace = ss.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
             System.out.println(replace);
*/
        String ssy = "aiuuf99900nsnudh8978789ynsudhy089897sd";
        //郵件網(wǎng)站過(guò)濾  只要出現(xiàn)5個(gè)以上的數(shù)字直接干掉為***  為了刻意去公布  使用了中國(guó)文字,將無(wú)法過(guò)濾信息
        ssy = ssy.replaceAll("\\d{5,}", "***");//比如:  衣二三四巴九零齊齊

        System.out.println(ssy);
    }

    private static void splitss(String str) {

       /* String[] strings = str.split("\\.+");
        for (String ss:strings) {
            System.out.println(ss);
        }*/

    /*    正則規(guī)則的復(fù)用,想復(fù)用,先封裝,正則封裝用()完成
        封裝完成后有編號(hào),從1開(kāi)始,規(guī)則中被()封裝的稱之為組,直接通過(guò)編號(hào)就可以調(diào)用對(duì)應(yīng)的組
        調(diào)用方式直接寫已有的組的編號(hào)加上\\
        如  :  ()\\1.在使用已有的第一組內(nèi)容,原則:先有組,才可以使用對(duì)應(yīng)的編號(hào)調(diào)用組.*/

        String[] strings = str.split("(.)\\1+");
        for (String ss : strings) {
            System.out.println(ss);
        }
    }
}

案例二
"23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10"

要求:將這些ip地址進(jìn)行排序

package example_1;

import java.util.Arrays;

/**
 * 思路:
 * 1.將ip通過(guò)空格切割
 * 2.對(duì)ip進(jìn)行排序Arrays.sort(),通過(guò)字符串字典順序進(jìn)行排序,這個(gè)順序,這個(gè)順序是錯(cuò)誤的
 * 原因: 每個(gè)ip有四塊,每一段最多有三位,每一位不超過(guò)255
 * 應(yīng)該按照位數(shù)來(lái)比較才對(duì)
 * 因此我們需要將非三位的數(shù)字轉(zhuǎn)換成三位.
 * <p>
 * 措施:將每個(gè)字段都添加兩個(gè)0,再取后面三位,比較后,打印時(shí)再去掉前面的零.
 */
public class Ip_demo {
    public static void main(String[] args) {
        String str = "23.11.10.5     192.168.1.103    3.3.3.3  10.10.10.10";
        //首先需要在每個(gè)字段前面添上兩個(gè)零
        str = str.replaceAll("(\\d+)", "00$1");

        //獲取最后每個(gè)字段后三位
        str = str.replaceAll("0*(\\d{3})", "$1");
        //使用.進(jìn)行切割成字符串?dāng)?shù)組
        String[] ips = str.split(" +");
        //將每個(gè)字符串進(jìn)行升序排列
        Arrays.sort(ips);
        //循環(huán)遍歷,并在遍歷的同時(shí)將每個(gè)字段前面的零去掉
        for (String ss : ips) {
            System.out.println(ss.replaceAll("0*(\\d+)", "$1"));
        }
    }
}

案例三:郵件校驗(yàn)功能
使用正則中的匹配功能

package example_1;


public class ItCast_mail {
    public static void main(String[] args) {
        /**
         * 郵件校驗(yàn)
         * 使用正則表達(dá)式中的匹配
         */
        String mail = "itcast@2019itcast.cn";

        String mails = "422399419@qq.com";

        //比較籠統(tǒng)的校驗(yàn)規(guī)則
        String regex = "\\w+@\\w+(\\.\\w+)+";

        //稍微完整的校驗(yàn)規(guī)則
        String regex1 = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]{2,3}){1,3}";
        boolean b = mail.matches(regex);
        boolean b1 = mails.matches(regex1);

        System.out.println(mail + "---------" + b);
        System.out.println(mails + "---------" + b1);

    }
}

基于本地網(wǎng)頁(yè)文件郵箱地址獲取

package java_WangYePaChong;

import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JiYuFile {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建文件源頭
        File file = new File("D:\\Java代碼\\Java進(jìn)階1\\regular01\\src\\java_WangYePaChong\\temple\\hello.html");
        //創(chuàng)建正則表達(dá)式源頭
        String regex = "\\w+@\\w+(\\.\\w+)+";
        //返回郵箱地址集合  可存儲(chǔ)到數(shù)據(jù)庫(kù)中
        Set<String> set = fileInMail(file, regex);

        //循環(huán)遍歷 后期可以存儲(chǔ)到數(shù)據(jù)庫(kù)中
        for (String ss : set) {
            System.out.println(ss);
        }

    }

    //基于文件源爬起取
    private static Set<String> fileInMail(File file, String regex) throws IOException {

        //創(chuàng)建存儲(chǔ)郵箱地址的集合對(duì)象
        Set<String> set = new HashSet<>();
        //創(chuàng)建正則表達(dá)式對(duì)象荣堰,并將規(guī)則傳入
        Pattern p = Pattern.compile(regex);


        //獲取字符讀取流對(duì)象
        BufferedReader buf = new BufferedReader(new FileReader(file));
        String line;
        //循環(huán)讀取操作
        while ((line = buf.readLine()) != null) {
            //使用正則對(duì)象創(chuàng)建匹配器對(duì)象
            Matcher m = p.matcher(line);
            //如果找到符合regex的萝映,便將符合的字符串存入到集合中
            while (m.find()) {
                set.add(m.group());
            }

        }
        //返回集合
        return set;
    }
}

獲取外網(wǎng)的html中的郵箱地址

package java_WangYePaChong;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlWangYeHtml {
    public static void main(String[] args) throws IOException {

        String str_url = "http://www.downxia.com/zixun/48009.html";

        String regex = "\\w+@\\w+(\\.\\w+)+";

        //創(chuàng)建url對(duì)象
        URL url = new URL(str_url);

        //創(chuàng)建基于網(wǎng)頁(yè)爬蟲(chóng)方法
        Set<String> set = getMail(url, regex);

        for (String ss : set) {
            System.out.println(ss);
        }
    }

    private static Set<String> getMail(URL url, String regex) throws IOException {

        URLConnection con = url.openConnection();
        Pattern p = Pattern.compile(regex);
        Set<String> set = new HashSet<>();
        BufferedReader buf = new BufferedReader(new InputStreamReader(con.getInputStream()));

        String line;
        //循環(huán)讀取操作
        while ((line = buf.readLine()) != null) {
            //使用正則對(duì)象創(chuàng)建匹配器對(duì)象
            Matcher m = p.matcher(line);
            //如果找到符合regex的涛浙,便將符合的字符串存入到集合中
            while (m.find()) {
                set.add(m.group());
            }

        }
        buf.close();
        return set;

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市按咒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌补履,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氛堕,死亡現(xiàn)場(chǎng)離奇詭異括儒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門贝攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事〖「睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵把敞,是天一觀的道長(zhǎng)弥奸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)奋早,這世上最難降的妖魔是什么盛霎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮耽装,結(jié)果婚禮上愤炸,老公的妹妹穿的比我還像新娘。我一直安慰自己掉奄,他們只是感情好规个,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著姓建,像睡著了一般诞仓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上速兔,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天墅拭,我揣著相機(jī)與錄音,去河邊找鬼憨栽。 笑死帜矾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屑柔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼珍剑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掸宛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起招拙,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唧瘾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后别凤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饰序,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年规哪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了求豫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝠嘉,靈堂內(nèi)的尸體忽然破棺而出最疆,到底是詐尸還是另有隱情,我是刑警寧澤蚤告,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布努酸,位于F島的核電站,受9級(jí)特大地震影響杜恰,放射性物質(zhì)發(fā)生泄漏获诈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一心褐、第九天 我趴在偏房一處隱蔽的房頂上張望舔涎。 院中可真熱鬧,春花似錦檬寂、人聲如沸终抽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昼伴。三九已至,卻和暖如春镣屹,著一層夾襖步出監(jiān)牢的瞬間圃郊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工女蜈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留持舆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓伪窖,卻偏偏與公主長(zhǎng)得像逸寓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子覆山,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349