11.1 正則表達式

2020-08-10 11:46:05

簡介

  1. 概念
    正則表達式(Regular Expression)是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個「規則字串」,這個「規則字串」用來表達對字串的一種過濾邏輯。
  2. 功能
    (1)測試字串內的模式。
    例如,可以測試輸入字串,以檢視字串內是否出現電話號碼模式或信用卡號碼模式。這稱爲數據驗證。
    (2)替換文字。
    可以使用正則表達式來識別文件中的特定文字,完全刪除該文字或者用其他文字替換它。
    (3)基於模式匹配從字串中提取子字串。
    可以查詢文件內或輸入域內特定的文字。
  3. 特點
    正則表達式並不僅限於某一種語言,但是在每種語言中有細微的差別。

語法

普通字元

      字母、數位、漢字、下劃線、以及沒有特殊定義的標點符號,都是「普通字元」。表達式中的普通字元,在匹配一個字串的時候,匹配與普通字元相同的一個字元。
      即如果想要匹配一個字串中的普通字元,直接輸入對應普通字元就好了。

簡單的跳脫字元

符號 含義
\n 代表換行符
\t 製表符
\\ 代表\本身
\^, \$, \., \ (, \ ), \{, \}, \?, \+, \*, \|, \ [, \] 匹配這些字元本身

標準字元集合

  • 能夠與 ‘多種字元’ 匹配的表達式
  • 注意區分大小寫,大寫是相反的意思
符號 含義
\d 任意一個數字,0~9中的任意一個
\w 任意一個字母或數位或下劃線,也就是A~Z,a~z,0~9,_ 中任意一個
\s 包括空格、製表符、換行符等空白字元的其中任意一個
. 小數點可以匹配除 換行符 外的任意一個字元,如果要匹配包括「\n」在內的所有字元,一般用「[\s\S]」

自定義字元集合

  • [ ] 方括號匹配方式,能夠匹配方括號中 任意一個 字元。
表達式 含義
[ab5@] 匹配「a」或「b」或「5」或「@」
[^abc] 匹配」a「,」b「,」c「之外的任意一個字元
[f-k] 匹配」f「~」k「之間的任意一個字母
[^A-F0-3] 匹配」A「~」F「,」0「~」3「之外的任意一個字元

注意

  1. 正則表達式的特殊符號,被包含到中括號中,則失去特殊意義,除了^, -之外。比如[\s\S],即是包含\s\S集閤中的任一字元,即是所有字元。
  2. 標準字元集合,除小數點外,如果被包含於中括號,自定義字元集合將包含該集合。比如:
    [\d.\-+] 將匹配:數位、小數點、-、+

量詞

  • 修飾匹配次數的特殊符號
符號 含義
{n} 表達式重複n次
{m,n} 表達式至少重複m次,最多重複n次
{m,} 表達式至少重複m次
? 匹配表達式0次或1次,相當於{0,1}
+ 表達式至少出現1次,相當於{1,}
* 表達式不出現或出現任意次,相當於{0,}

注意

  1. 預設匹配的字元數是最多的,即儘可能的多。(因爲次數有時是一個範圍嘛)
  2. 如果想匹配的字元是最少的,可以在符號後面新增「?」號,此時匹配的字元數儘可能的少。比如{m,n}?

字元邊界

  • 本組標記匹配的不是字元而是位置,即符和對應條件的位置。
標記 含義
^ 與字串開始的地方匹配
$ 與字串結束的地方匹配
\b 匹配一個單詞邊界

注意

  1. \b匹配這樣一個位置:前面的字元和後面的字元 不全是 \w。
  2. \b222\b:其中兩個「\b」分別表示的是數位 222 前後的位置,比如在字串ac222de中,分別表示的是c和2之間 和 2和d之間的位置。

選擇符和分組

  1. 分組
表達式 作用
| - 分支結構 左右兩邊表達式之間「或」關係, 匹配左邊或者右邊
() - 捕獲組 (1)在被修飾匹配次數的時候,括號中的表達式可以作爲整體被修飾;(2)取匹配結果的時候,括號中的表達式匹配到的內容可以被單獨得到;(3)每一對括號會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號。捕獲元素編號爲零的第一個捕獲是由整個正則表達式模式匹配的文字
(?:Expression) - 非捕獲組 一些表達式中,不得不使用(),但又不需要儲存()中子表達式匹配的內容,這時可以使用非捕獲組來抵消使用()帶來的副作用
  1. 反向參照(\nnn)
    (1)每一對()會分配一個編號,使用 () 的捕獲根據左括號的順序從1開始自動編號。
    (2)通過反向參照,可以對分組已捕獲的字串進行參照。

預搜尋(零寬斷言)

  • 只進行子表達式的匹配,匹配內容不計入最終的匹配結果,是零寬度。
  • 判斷當前位置的前後字元,是否符和指定的條件,但不匹配前後的字元。是對位置的匹配。
  • 正則表達式匹配過程中,如果子表達式匹配到的是字元內容,而非位置,並被儲存到最終的匹配結果中,那麼就認爲這個子表達式是佔有字元的;如果子表達式匹配的僅僅是位置,或者匹配的內容並不儲存到最終的匹配結果中,那麼就認爲這個子表達式是零寬度的。佔有字元還是零寬度,是針對匹配的內容是否儲存到最終的匹配結果中而言的。
  • 匹配滿足斷言條件的字串。不包含斷言中的exp內容。

表達式:

表達式 含義
(?=exp) 斷言自身出現的位置的後面能匹配表達式exp
(?<=exp) 斷言自身出現的位置的前面能匹配表達式exp
(?!exp) 斷言此位置的後面不能匹配表達式exp
(?<!exp) 斷言此位置的前面不能匹配表達式exp

使用流程

  1. 分析所要匹配的數據,寫出測試用的典型數據。
  2. 在工具軟體中進行匹配測試。
  3. 在程式中呼叫通過測試的正則表達式。

java程式設計中的應用