国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Java正則表達(dá)式

Taste / 795人閱讀

摘要:正則表達(dá)式是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類(lèi)庫(kù)包。是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。

Java正則表達(dá)式

java.util.regex是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類(lèi)庫(kù)包。它包括兩個(gè)類(lèi):PatternMatcher。Pattern是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。Matcher對(duì)象是一個(gè)狀態(tài)機(jī)器,它依據(jù)Pattern對(duì)象做為匹配模式對(duì)字符串展開(kāi)匹配檢查。 首先一個(gè)Pattern實(shí)例訂制了一個(gè)所用語(yǔ)法與PERL的類(lèi)似的正則表達(dá)式經(jīng)編譯后的模式,然后一個(gè)Matcher實(shí)例在這個(gè)給定的Pattern實(shí)例的模式控制下進(jìn)行字符串的匹配工作。

正則表達(dá)式的構(gòu)造摘要

詳細(xì)摘要請(qǐng)看jdk中文文檔,下面我只是列出一些經(jīng)常使用的

構(gòu)造 匹配
. 任何字符(與行結(jié)束符可能匹配也可能不匹配)
d 數(shù)字:[0-9]
D 非數(shù)字: 1
s 空白字符:[ tnx0Bfr]
S 非空白字符:2
w 單詞字符:[a-zA-Z_0-9]
W 非單詞字符:3
[abc] a、b 或 c(簡(jiǎn)單類(lèi))
4 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(nèi)(范圍)
^ 行的開(kāi)頭
$ 行的結(jié)尾
X? X,一次或一次也沒(méi)有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過(guò) m 次
Pattern

正則表達(dá)式的編譯表示形式,學(xué)過(guò)python的都知道這個(gè)和python的正則表達(dá)式有異曲同工之妙。 但是它的構(gòu)造方法是私有的,因此不能直接創(chuàng)建對(duì)象,但是可以調(diào)用它的靜態(tài)方法返回一個(gè)對(duì)象,下面會(huì)詳細(xì)介紹

創(chuàng)建對(duì)象

Pattern類(lèi)用于創(chuàng)建一個(gè)正則表達(dá)式,也可以說(shuō)創(chuàng)建一個(gè)匹配模式,它的構(gòu)造方法是私有的,不可以直接創(chuàng)建,但可以通過(guò)Pattern.complie(String regex)簡(jiǎn)單工廠(chǎng)方法創(chuàng)建一個(gè)正則表達(dá)式,代碼如下:

    //采用的complie(String regex)
    Pattern pattern = Pattern.compile("d+");
    
    //采用的是complie(String regex,int flag)其中flag表示標(biāo)志,下面的標(biāo)志表示忽略字母大小寫(xiě),詳細(xì)的字段請(qǐng)看文檔
    Pattern pattern=Pattern.compile("(CHEN)(D*)(d*)",Pattern.CASE_INSENSITIVE);
常用方法

Pattern compile(String regex) 用于創(chuàng)建Pattern對(duì)象

Pattern compile(String regex,int flags) 用于創(chuàng)建Pattern對(duì)象,并且指定了標(biāo)志(比如忽略字母大小寫(xiě))

int flags() 返回此模式的匹配標(biāo)志

String pattern() 返回在其中編譯過(guò)此模式的正則表達(dá)式。

String[] split(CharSequence input) 根據(jù)此模式的正則表達(dá)式將輸入的字符串拆分成String數(shù)組,默認(rèn)的都是全部拆分開(kāi)

    //給出正則表達(dá)式用于匹配數(shù)字(0-9)
    Pattern pattern = Pattern.compile("d+");
    String str = "我是陳加兵456鄭元梅34擦市場(chǎng)的邏輯啊";
    String[] splits = pattern.split(str, 2);   //結(jié)果:[我是陳加兵,鄭元梅34擦市場(chǎng)的邏輯啊]

String[] split(CharSequence input,int limit) 將字符串按照正則表達(dá)式表示的內(nèi)容進(jìn)行分組,如果limit>0那么就分成limit個(gè)組,如果limit<0就按照默認(rèn)全部分開(kāi)

    //給出正則表達(dá)式用于匹配數(shù)字(0-9)
    Pattern pattern = Pattern.compile("d+");
    String str = "我是陳加兵456鄭元梅34擦市場(chǎng)的邏輯啊";
    String[] splits = pattern.split(str, 2);   //結(jié)果:[我是陳加兵,鄭元梅34擦市場(chǎng)的邏輯啊]

Pattern.matches(String regex,CharSequence input)是一個(gè)靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串

    Pattern.matches("d+","2223");//返回true 
    Pattern.matches("d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 
    Pattern.matches("d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到 

Matcher matcher(CharSequence input) 創(chuàng)建匹配給定輸入與此模式的匹配器,現(xiàn)在只是先了解以下,下面會(huì)詳細(xì)解釋Matcher這個(gè)類(lèi)

    Pattern p=Pattern.compile("d+"); 
    Matcher m=p.matcher("22bb23"); 
Matcher

Pattern類(lèi)只能做一些簡(jiǎn)單的匹配操作,要想得到更強(qiáng)更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類(lèi)提供了對(duì)正則表達(dá)式的分組支持,以及對(duì)正則表達(dá)式的多次匹配支持.
Matcher類(lèi)和Pattern類(lèi)一樣它的構(gòu)造方法同樣是私有的,因此不能直接構(gòu)造對(duì)象,但是上面我們說(shuō)過(guò)Pattern類(lèi)中有一個(gè)方法可以返回一個(gè)Matcher對(duì)象(matcher(CharSequence input))

常用的方法

boolean mathces() 嘗試將整個(gè)區(qū)域與模式匹配(針對(duì)的是整個(gè)字符串,如果整個(gè)字符串未完全匹配,那么返回false,如果完全匹配那么返回true)

        Pattern pattern=Pattern.compile("d+");  //創(chuàng)建Pattern對(duì)象
        String str="I am hreo 1234";  //需要匹配的字符串
        Matcher matcher=pattern.matcher(str);
        //并沒(méi)有完全匹配,因此返回false,如果str="123445",那么就會(huì)返回true
        System.out.println(matcher.matches());  

boolean lookingAt() 嘗試從給定字符串的開(kāi)頭開(kāi)始匹配,如果有子字符串匹配成功,那么返回true(針對(duì)的不是整個(gè)字符串,而是從開(kāi)頭開(kāi)始,如果開(kāi)頭有一段字符串匹配成功,那么返回true)

        Pattern pattern=Pattern.compile("d+");  //創(chuàng)建Pattern對(duì)象
        String str="1234 I am a hero";  //需要匹配的字符串
        Matcher matcher=pattern.matcher(str);
        //開(kāi)頭的1234匹配到了,因此返回true,如果str="I am a hero  1234"將返回false
        System.out.println(matcher.lookingAt());

int start() 匹配到的字符串的第一個(gè)元素的索引,如果沒(méi)有匹配到調(diào)用此方法將會(huì)報(bào)錯(cuò)

int end() 匹配到的字符串的最后一個(gè)元素的索引,如果沒(méi)有匹配到調(diào)用此方法將會(huì)報(bào)錯(cuò)

String group() 返回的是匹配到的字符串,如果沒(méi)有匹配到調(diào)用此方法將會(huì)報(bào)錯(cuò)

        Pattern pattern=Pattern.compile("d+");  //創(chuàng)建Pattern對(duì)象
        String str="1234 I am a hero 33455";  //需要匹配的字符串
        Matcher matcher=pattern.matcher(str);
        if(matcher.lookingAt())
        {
            System.out.println("開(kāi)始匹配到下標(biāo)為"+matcher.start());  //0
            System.out.println("匹配結(jié)束的下標(biāo)為"+matcher.end());    //4
            System.out.println("匹配的字符串為"+matcher.group());  //1234
        }

boolean find() 查找整個(gè)字符串,如果在任意位置有一段字符串能夠匹配成功,那么返回true(任意位置),然后如果再次調(diào)用這個(gè)查找的話(huà),那么就從上次查找到的末尾開(kāi)始匹配,也就是說(shuō)查找的是下一個(gè)子序列了

        Pattern pattern=Pattern.compile("d+");  //創(chuàng)建Pattern對(duì)象
        String str="1234 I am a hero 6666 chenjiabing8888";  //需要匹配的字符串
        Matcher matcher=pattern.matcher(str);
        while(matcher.find())  //如果還有匹配的字符序列
        {
            System.out.println("開(kāi)始匹配到下標(biāo)為"+matcher.start()); 
            System.out.println("匹配結(jié)束的下標(biāo)為"+matcher.end());   
            System.out.println("匹配的字符串為"+matcher.group());  
        }  
        
    /*結(jié)果如下:
     * 
    開(kāi)始匹配到下標(biāo)為0
    匹配結(jié)束的下標(biāo)為4
    匹配的字符串為1234
    開(kāi)始匹配到下標(biāo)為17
    匹配結(jié)束的下標(biāo)為21
    匹配的字符串為6666
    開(kāi)始匹配到下標(biāo)為33
    匹配結(jié)束的下標(biāo)為37
    匹配的字符串為8888
    */
    
    /*
     * 從上面返回的結(jié)果可以知道,find()可以匹配多次只要這個(gè)字符串還有可以匹配,
     * 并且每次的匹配字段的開(kāi)始下標(biāo)都是上一次匹配的結(jié)束字母的下一個(gè)下標(biāo)
     */

boolean find(int start) 從指定的索引start位置開(kāi)始匹配,這個(gè)用于重置find()匹配器,因?yàn)橹苯邮褂胒ind()它的每次開(kāi)始的索引都是不一樣的

String group(int num) 返回指定分組匹配到的字符串,group(0)表示匹配到的整個(gè)字符串,group(1) 表示匹配到的第一個(gè)字符(即是第一個(gè)括號(hào)中匹配的模式)

int groupCount() 返回匹配到的分組個(gè)數(shù)

String replaceAll(String str) 將所有于模式相匹配的 字符串全部替換程指定的字符串str,返回的是替換后的文本

String replaceFirst(String str) 只將第一次匹配到的字符串替換成指定的字符串str,返回的時(shí)替換后的文本

        Pattern pattern=Pattern.compile("d+");
        String str="chenjiabing2344cal3445";
        Matcher matcher=pattern.matcher(str);
        str=matcher.replaceFirst("陳加兵");   
        System.out.println(str);   //輸出:chenjiabing陳加兵cal3445
        
        /*
         * str=matcher.replaceAll("陳加兵");
         * System.out.println(str)    //輸出:chenjiabing陳加兵cal陳加兵
         */
捕獲組

捕獲組可以通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào),編號(hào)是從1 開(kāi)始的。例如,在表達(dá)式 ((A)(B(C)))中,存在四個(gè)這樣的組:

        ((A)(B(C)))
        (A)
        (B(C))
        (C)

總之在正則表達(dá)式中在括號(hào)中的就是一個(gè)分組,下面用一個(gè)實(shí)例來(lái)理解一下

        Pattern pattern=Pattern.compile("(D*)(d+)s(D+)");
        Matcher matcher=pattern.matcher("chenjiabingshizuibangde6666 chenjiabign");
        if(matcher.find())
        {
            System.out.println("總共匹配到了"+matcher.groupCount()+"個(gè)分組");
            System.out.println("匹配到整個(gè)字符串為"+matcher.group(0));
            System.out.println("匹配到的第一個(gè)字符串為"+matcher.group(1));
            System.out.println("匹配到的第二個(gè)字符串為"+matcher.group(2));
            System.out.println("匹配到的第三個(gè)字符串為"+matcher.group(3));
        }
貪婪模式和非貪婪模式

貪婪與非貪婪模式影響的是被量詞修飾的子表達(dá)式的匹配行為,貪婪模式在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配
一般寫(xiě)python爬蟲(chóng)的時(shí)候使用的都是非貪婪模式來(lái)匹配
使用了貪婪模式后會(huì)盡可能匹配更多的字符串,即是到了正則表達(dá)式定的末尾但是還是會(huì)繼續(xù)向后匹配,看看是否還能匹配,非貪婪模式則是相反,到了正則表達(dá)式定義的結(jié)束字符就直接停止匹配了
貪婪模式: .* , .+
非貪婪模式: .*? , .+?

實(shí)例
        //使用了貪婪模式,因此當(dāng)匹配到第一個(gè)
的時(shí)候還要向后面匹配看看是否還能匹配到,由于后面還有
結(jié)尾的,因此還是能夠匹配的,因此匹配到的是:陳加兵
鄭元梅 Pattern pattern=Pattern.compile("
(.*)
"); //使用了非貪婪模式,因此當(dāng)匹配到第一個(gè)
的時(shí)候就不向后面匹配了,直接返回了,因此匹配到的是:陳加兵 Pattern pattern1=Pattern.compile("
(.*?)
"); String str="
陳加兵
鄭元梅
"; Matcher matcher=pattern1.matcher(str); if(matcher.find()) { System.out.println(matcher.groupCount()); //1 System.out.println(matcher.group(1)); //輸出匹配到的字符串,此時(shí)輸出的是:陳加兵,如果使用貪婪模式輸出的是:陳加兵
鄭元梅 } 參考文章

http://www.cnblogs.com/ggjucheng/p/3423731.html

http://www.runoob.com/java/java-regular-expressions.html

http://blog.csdn.net/lxcnn/article/details/4756030

0-9 ?

s ?

w ?

abc ?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70136.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<