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

資訊專欄INFORMATION COLUMN

正則表達式 深入淺出2--從java API開始

andycall / 683人閱讀

摘要:正則表達式等待匹配的字符這里可以輸入任何繼承了的類返回一個值說明是否匹配這里需要注意的是,和均不允許通過構造器新建一個對象。

前言

之前一直想要做一個自己的爬蟲,然后從nba數據相關的網上【虎撲,騰訊,官網等,要視網站是否支持】爬點數據寫數據分析和圖形化展示。雖然年輕的時候就實現過這個功能,但是當時直接借用了一個網上現成的jar包,然后在那個基礎上寫了一個非常簡陋的正則表達式來提取數據。這次打算自己用JAVA API寫一個爬蟲,里面除了能讀取HTML或是JSON或是XML,還要能夠相應的支持多線程【這個功能將最后完成】。
今天這篇博客重點講解java中和正則表達式相關的API為后序程序的實現做一個鋪墊。后序的實現將在未來的博客3或4或5中展示,也會提供github源碼來供大家參考和指教。所以也歡迎大家關注我,以便獲得后序的更新。

進階的正則表達式

關于正則表達式的基本知識請參考我的博客正則表達式 深入淺出1--你的符號我做主【持續更新中
在這里,我需要再補充一些博客1中沒有提及但是必須了解的知識。(完整的正則表達式構造子列表請參考JAVA的API,在文章最后有給出傳送門)

其它符號

在博客1中,我將最常用的一些符號整理出來,這里再說一些還需要了解的符號。

字符

xhh 十六進制值為0xhh的字符
uhhhh 十六進制表示為oxhhhh的Unicode字符

字符類

[abc[def]] 相當于合并操作 等價于[abcdef]
[a-z&&[hij]] 相當于交集操作,等價于[hij]
[a-z&&[^b-d]] 相當于減操作 等價于[ae-z]

邊界匹配符

 詞的邊界,詞的邊界是指w和W之間的位置,它是一個定位符,并不代表任何具體的字符
B 非詞的邊界,也就是是w和w 以及W和W之間的位置

這里新添的兩個定界符有點難理解。我們已知w是指詞字符[a-zA-Z0-9],而W是指[^a-zA-Z0-9]。這里舉個例子來說明bB都匹配了什么。
假設我們待匹配的字符串為"hello world! "
如果調用方法String[] result = s.split("");
那么我們會發現輸出為["hello", "world", " ", "! rn"],也就是說我們可以將字符串看成是"_hello_ _world_! "其中_代表單詞分界處。
那么如果_代表非單詞分界處,那么上述句子可以表示成"h_e_l_l_o w_o_r_l_d!_ _ "

那么,在大多數情況下,我們都會通過詞的邊界符來實現獲取而不是進行判斷。

量詞

量詞描述了一個模式吸收輸入文本的方式。量詞總共分為三種,貪婪型、勉強型和占有型。下面分別介紹這三種量詞以便更好的構建正則表達式。

貪婪型

貪婪型模式下的正則表達式會發現盡可能多的匹配。也就是說,即便當前情況已經滿足了匹配,貪婪模式還是會繼續測試下一個字符直至匹配失敗為止。一旦匹配失敗,就開始回退直至找到合適的匹配。

在默認情況下的一般正則表達式都是貪婪型的。

勉強型

在希望勉強匹配的正則表達式后面加?號即可進行勉強匹配。勉強匹配是指這個量詞滿足模式所需要的最小字符數就立刻停止。

占有型

目前,這種類型的量詞只在JAVA中才可以用。占有型不同于前面兩者,它不會進行回溯。我們知道一個正則表達式對應的字符串可能有多種。在貪婪型中,如果下一個匹配失敗,則放出已占有字符回溯到上一個滿足的情形繼續判斷。而勉強型則是多占有一個字符繼續判斷。占有型則不保存這些中間結果。一旦占有則不會釋放。

下面舉一個例子來說明這些情況:

輸入的字符串:info
貪婪模式正則表達式:<.*>
返回輸出:info
勉強模式正則表達式:<.*?>
返回輸出:
占有模式正則表達式:<.*+>
返回輸出:info

Pattern和Matcher API

在Java中,和正則表達式最息息相關的兩個類就是PatternMatcher了。基本上所有正則表達式的底層實現都是通過Pattern和Matcher來實現的。比如說,我們非常了解的String中的matches方法,實際上也是通過Pattern和Matcher的配合來實現的。
在這篇博客中,我將介紹重點的API,詳細的信息請各位自行參考JAVA DOC。

創建正則表達式并判斷字符流是否符合。

    Pattern pattern = Pattern.compile("正則表達式");
    Matcher matcher = pattern.matcher("等待匹配的字符");//這里可以輸入任何繼承了CharSequence的類
    matcher.matches();//返回一個boolean值說明是否匹配

這里需要注意的是,Pattern和Matcher均不允許通過構造器新建一個對象。不僅如此,Pattern類是相對而言線程安全的,而Matcher類不是如此。

Pattern類

構造器

    static Pattern compile(String regex)
    static Pattern compile(String regex, int flag);

第二個構造pattern的方法中多了一個flag參數,這個參數允許我們定義pattern的模式,這里講幾個比較重要的模式:

Pattern.CASE_INSENSITIVE: 等價于正則表達式中的?i,是的匹配可以大小寫不敏感
Pattern.COMMENTS : 等價于正則表達式中的?x,會忽略空格符和以#開頭到行末的注釋
Pattern.MULTILINE : 等價于?m,使得^和&符號可以匹配一行的始末,而不僅僅是整個字符串的始末

如果希望有多個Pattern,可以輸入Pattern.compile("正則表達式", Pattern1 | Pattern2 | Pattern3)

分割
Pattern自己也定義了split方法。它會根據之前compile的正則表達式進行分割并返回String[],limit值是指分割出的String[]的size不會超過這個limit值。

String[] split(CharSequences c, int limit)
String[] split(CharSequences c)

分組
在這里還需要在講解一個分組的概念以便為后面做鋪墊。正則表達式的分組是指將一對括號中的表達式劃為一個分組。因此形如A(B(CD)(E))的正則表達式一共有四個分組{A(B(CD)(E)),B(CD)(E),(CD),(E)},其中第0個分組默認為完整的正則表達式。

Matcher類

查找

     int groupCount() //返回除了第0組的總分組數
     boolean find() //從當前下標開始匹配,如果存在滿足正則表達式的值,則返回true
     boolean find(int i)//從下標i開始匹配,如果存在滿足正則表達式的值,返回true
     String group() //返回前一次匹配的第0個分組的內容
     String group(int i)//返回前一次匹配的第i個分組的內容
     int start() //返回上一次匹配成功的內容的起始下標
     int end() //返回上一次匹配成功的內容的終止下標+1

舉個栗子

    Pattern p = Pattern.compile("<.*?>");
    Matcher matcher = p.matcher("data");
    while(matcher.find()){
        System.out.println(matcher.group());
        //先后輸出 
    }

替換

    void replaceFirst(String replacement);
    void replaceAll(String replacement);
    void appendReplacement(StringBuffer s, String replacement);
    void appendTail(StringBuffer s);

這里講一下appendReplacement和appendTail方法。appendReplacement允許開發者在替換的過程中針對將被替換的內容進行一些動態的操作。這個方法將逐步推進的向前替換,并將替換的結果添加到輸入的s中。除此以外,對于沒有被掃描到的部分,可以通過appendTail方法添加到輸入的s中。

例子:

    Pattern p = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher("hello world one hello world 2");
    StringBuffer s = new StringBuffer();
    while(m.find()){
        m.appendReplacement(s, m.group().toUpperCase());
        System.out.println(s);
    }
    m.appendTail(s);
    System.out.println(s);

輸出為:

小結

其實正則表達式的適用范圍非常廣,除了和CharSequence配合使用之外,還可以和JAVA I/O如Scanner類,InputReader類等聯合使用。核心還是在于Pattern類和Matcher類的組合使用。

References

JAVA API

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

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

相關文章

  • Java進階之路

    摘要:探索專為而設計的將探討進行了何種改進,以及這些改進背后的原因。關于最友好的文章進階前言之前就寫過一篇關于最友好的文章反響很不錯,由于那篇文章的定位就是簡單友好,因此盡可能的摒棄復雜的概念,只抓住關鍵的東西來講,以保證大家都能看懂。 周月切換日歷 一個可以進行周月切換的日歷,左右滑動的切換月份,上下滑動可以進行周,月不同的視圖切換,可以進行事件的標記,以及節假日的顯示,功能豐富 Andr...

    sushi 評論0 收藏0
  • Java深入 - Java正則表達 Pattern和Matcher

    摘要:它包括兩個類和一個是一個正則表達式經編譯后的表現模式。這個標志能讓表達式忽略大小寫進行匹配。默認情況下,這兩個表達式僅僅匹配字符串的開始和結束。返回當前查找而獲得的與指定的組匹配的子串內容 Pattern和MatcherJava.util.regex 是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和MatcherPattern: 一個Patt...

    baiy 評論0 收藏0
  • java正則表式的使用

    摘要:直接使用正則表達式對輸入的字符串進行匹配,匹配成功則返回使用正則表示式,進行字符串分割進行匹配操作,如果匹配成功,這三個方法都會返回其中,是在源字符串中找出和正則表達式匹配的字符串。 概念 正則表達式 在閱讀本文前,你應該已經了解了正則表達式的基本概念以及如何書寫正則表達式。如果對正則表達式不是太了解,或者想更深入地了解正則表示式,請點擊這里。 捕獲組 捕獲組能夠讓我們方便地從正則表達...

    zoomdong 評論0 收藏0
  • Java開發

    摘要:大多數待遇豐厚的開發職位都要求開發者精通多線程技術并且有豐富的程序開發調試優化經驗,所以線程相關的問題在面試中經常會被提到。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 JVM 內存溢出實例 - 實戰 JVM(二) 介紹 JVM 內存溢出產生情況分析 Java - 注解詳解 詳細介紹 Java 注解的使用,有利于學習編譯時注解 Java 程序員快速上手 Kot...

    LuDongWei 評論0 收藏0

發表評論

0條評論

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