正規表示式總結

蘇生發表於2019-01-19

正規表示式總結

@(Java知識點總結)[Java, 正規表示式]

正規表示式(regular expression)

為什麼需要正規表示式?

  • 文字的複雜處理 。

正規表示式的優勢和用途?

  • 一種強大而靈活的文字處理工具;
  • 大部分程式語言、資料庫、文字編輯器、開發環境都支援正在表示式。

正規表示式定義:

  • 正如他的名字一樣是描述了一個規則,通過這個規則可以 匹配一類字串 。
  • 學習正規表示式很大程度上就是學習表示式的語法規則。

開發中使用正規表示式的流程:

  • 分析所要匹配的資料,寫出測試用的典型資料
  • 在工具軟體中進行匹配測試
  • 在程式中呼叫通過測試的正規表示式

語法

<caption>縱向合併單元格</caption>

<!–rowspan中必須指定要合併的列數目,是兩行還是三行等等–>

普通字元</t> 字母、數字、漢字、下劃線、以及沒有特殊定義的標點符號,都是“普通字元”。
表示式中的普通字元,在匹配一個字串的時候,匹配與之相同的一個字元
簡單轉義字元
n 代表換行符
t 製表符
代表本身
^ , &dollar; , . , ( , { , } ,
? , + , * , | , [ , ]
匹配這些字元本身
標準字符集合
(注意大小寫區分,大寫是相反的意思)
d 任意一個數字,0~9中的任意一個
w 任意一個字母或數字或下劃線,
也就是A~Z,a~z,0~9,_中任意一個
s 包括空格、製表符、換行符等空白字元的其中任意一個
. 小數點可以匹配除了換行符的任意一個字元
如果要匹配包括“n”在內的所有字元,用[sS]
自定義字符集合
– []能夠匹配方括號中的任意一個字元
[ab5@] 匹配a或b或5或@
[ ^abc ] 匹配a、b、c 之外的任意一個字元
[f-k] 匹配f~k之間的任意一個字母
[ ^A-F0-3 ] 匹配A~F,0~3之外的任意一個字元
自定義字符集合
– []能夠匹配方括號中的任意一個字元
量詞
(Quantifier)
修飾匹配次數的特殊符號
{n} 表示式重複n次
{m,n} 表示式至少重複m次,至多重複n次
{m,} 表示式至少重複m次
非貪婪模式:修飾匹配次數的特殊符號後加一個?,表示匹配的字元越少越好。
例如:d{3,6}? 表示:匹配3個數字
相當於{0,1},表示式匹配0次或1次
+ 相當於 {1,},表示式至少匹配一次
* {0,},表示式不出現或出現任意次
字元邊界
(匹配的是位置)
^ 字串開始的地方匹配
$ 字串結束的地方匹配
b 匹配一個單詞邊界,前面的字元和後面的字元不全是w
匹配模式
IGNORECASE 忽略大小寫模式 匹配是忽略大小寫
預設情況下,正規表示式是要區分大小寫的
SINGLELINE 單行模式 整個文字看作一個字串,只有一個開頭,一個結尾
使小數點“.”,可以匹配包含換行符(n)在內的任意字元
MULITILINE 多行模式 每行都是一個字串,都有開頭和結尾
在指定了MULTILINE之後,如果選喲僅匹配字串開始和結束位置,可以使用A和Z
選擇符和分組
| 分支結構 匹配是忽略大小寫
預設情況下,正規表示式是要區分大小寫的
() 捕獲組 (1)在被修飾匹配次數的時候,括號中的表示式可以作為整體被修飾。
(2)取匹配結果的時候,括號中的表示式匹配到的內容可以被單獨得到。
(3)每一對括號會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號。捕獲元素編號為零的第一個捕獲是由整個正規表示式模式匹配的文字。
(?:Expression)
非捕獲組
一些表示式中,不得不使用(),但又不需要儲存()中子表示式匹配的內容,這時可以用非捕獲組來抵消使用()帶來的副作用。
反向引用(nnn)
– 每一對()會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號。
– 通過反向引用,可以對分組已捕獲的字串進行引用。
預搜尋
(零寬斷言)
(?=exp) 斷言自身出現的位置的 __後面__能匹配表示式exp
(?<=exp) 斷言自身出現的位置的 __前面__能匹配表示式exp
(?!=exp) 斷言此位置的__後面__不能匹配表示式exp
(?<!exp) 斷言此位置的__前面__不能匹配表示式exp
– 只進行子表示式的匹配,匹配內容不計入最終的匹配結果,是零寬度。
– 這個位置應該符合某個條件。判斷當前位置的前後字元,是否符合指定的條件,但不匹配前後的字元。是對位置的匹配。
– 正規表示式匹配過程中,如果子表示式匹配到的是字元內容,而非位置,並被儲存到最終的匹配結果中,那麼就認為這個子表示式是佔有字元的;如果子表示式匹配的僅僅是位置,或者匹配的內容並不儲存到最終的匹配結果中,那麼就認為這個子表示式是零款單獨的。佔有字元還是零寬度,是針對匹配的內容是否儲存到最終的陪陪結果中而言的。
例如:[a-z]+(?!d+),匹配以任意個字母開頭且後面不能有數字的表示式。。

常用表示式

電話號碼驗證

思路:

  1. 由數字和“-”構成
  2. 電話號碼為7到8位
  3. 如果電話號碼中包含有區號,那麼區號為三位或四位,首位是0
  4. 區號用“-”和其他部分隔開
  5. 行動電話號碼為11位
  6. 11位行動電話號碼的第一位和第二位為“13”,“15”,“18”

(0d{2,3}-d{7,9})(1[35789]d{9})

電子郵件地址驗證

思路:

  1. 使用者名稱:字母、數字、中劃線、下劃線組成。
  2. @
  3. 網址:字母、數字組成。
  4. 小數點:.
  5. 組織域名:2-4位字母組成。
  6. 不區分大小寫

[w-+@[a-z0-9A-Z]+(.[A-Za-z]{2,4}){1,2}

Java中使用正規表示式

java.util.regex包下面:

 類 Parttern:正規表示式的編譯表示形式。
 類 Matcher:通過解釋 Pattern 對 字串執行匹配操作的引擎。

/**
 * 電話號碼正規表示式測試
 * @author TR
 *
 */
public  class Reg {
 
  public static void main(String[] args) {
    //建立正規表示式,並啟用相應模式
    //java中轉為\
    Pattern p = Pattern.compile("(0\d{2,3}-\d{7,9})|(1[35789]\d{9})" );
    //匹配字串
    Matcher m = p.matcher("010-7758258");
    boolean yesorno = m.matches();
    System.out.println(yesorno);
  }
}
/**
 * 分組
 * @author TR
 *
 */
public  class Reg {
 
  public static void main(String[] args) {
    
    Pattern p = Pattern.compile("([1-9]+)([a-z]+)");
    //該方法掃描輸入的序列,查詢與該模式匹配下一個序列
    Matcher m = p.matcher("23434aaa**sfsd233**23dffd" );
    
    while(m.find()){
      System.out.println(m.group());
      System.out.println(m.group(1));
      System.out.println(m.group(2));
      System.out.println("~~~~~~~~~~~~~~~~~~~~");
    }
  }
}

public class Reg {
 
  public static void main(String[] args) {
    
    
  Pattern p = Pattern.compile("[0-9]");
  //該方法掃描輸入的序列,查詢與該模式匹配下一個序列
  Matcher m = p.matcher("23434aaa");
  
  System.out.println(m.replaceAll("#")); //替換  #####aaa
  
  String s = "aa222bb333cc3434";
  String[] arrs = s.split("\d+");  //切割
  System.out.println(Arrays.toString(arrs)); //[aa, bb, cc]
  
  }
}

相關文章