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

資訊專欄INFORMATION COLUMN

Java正則表達式

Taste / 789人閱讀

摘要:正則表達式是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。是一個正則表達式經編譯后的表現模式。

Java正則表達式

java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:PatternMatcher。Pattern是一個正則表達式經編譯后的表現模式。Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。 首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經編譯后的模式,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。

正則表達式的構造摘要

詳細摘要請看jdk中文文檔,下面我只是列出一些經常使用的

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

正則表達式的編譯表示形式,學過python的都知道這個和python的正則表達式有異曲同工之妙。 但是它的構造方法是私有的,因此不能直接創建對象,但是可以調用它的靜態方法返回一個對象,下面會詳細介紹

創建對象

Pattern類用于創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(String regex)簡單工廠方法創建一個正則表達式,代碼如下:

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

Pattern compile(String regex) 用于創建Pattern對象

Pattern compile(String regex,int flags) 用于創建Pattern對象,并且指定了標志(比如忽略字母大小寫)

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

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

String[] split(CharSequence input) 根據此模式的正則表達式將輸入的字符串拆分成String數組,默認的都是全部拆分開

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

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

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

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

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

Matcher matcher(CharSequence input) 創建匹配給定輸入與此模式的匹配器,現在只是先了解以下,下面會詳細解釋Matcher這個類

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

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

常用的方法

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

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

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

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

int start() 匹配到的字符串的第一個元素的索引,如果沒有匹配到調用此方法將會報錯

int end() 匹配到的字符串的最后一個元素的索引,如果沒有匹配到調用此方法將會報錯

String group() 返回的是匹配到的字符串,如果沒有匹配到調用此方法將會報錯

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

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

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

boolean find(int start) 從指定的索引start位置開始匹配,這個用于重置find()匹配器,因為直接使用find()它的每次開始的索引都是不一樣的

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

int groupCount() 返回匹配到的分組個數

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

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

        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陳加兵
         */
捕獲組

捕獲組可以通過從左到右計算其開括號來編號,編號是從1 開始的。例如,在表達式 ((A)(B(C)))中,存在四個這樣的組:

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

總之在正則表達式中在括號中的就是一個分組,下面用一個實例來理解一下

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

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

實例
        //使用了貪婪模式,因此當匹配到第一個
的時候還要向后面匹配看看是否還能匹配到,由于后面還有
結尾的,因此還是能夠匹配的,因此匹配到的是:陳加兵
鄭元梅 Pattern pattern=Pattern.compile("
(.*)
"); //使用了非貪婪模式,因此當匹配到第一個
的時候就不向后面匹配了,直接返回了,因此匹配到的是:陳加兵 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)); //輸出匹配到的字符串,此時輸出的是:陳加兵,如果使用貪婪模式輸出的是:陳加兵
鄭元梅 } 參考文章

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 ?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70136.html

相關文章

發表評論

0條評論

Taste

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<