正則表達式基礎(Regular Expression)
正則表達式簡介
n 為什么需要正則表達式?
q 文本的復雜處理。
n 正則表達式的優勢和用途?
q 一種強大而靈活的文本處理工具;
q 提供了一種緊湊的、動態的方式,能夠以一種完全通用的方式來解決各種字符串處理(例如:驗證、查找、替換等)問題;
q 大部分語言、數據庫都支持正則表達式。
n 正則表達式定義:
q 正如他的名字一樣是描述了一個規則,通過這個規則可以匹配一類字符串。
n 正則表達式的用處:
q 驗證給定字符串是否符合指定特征,比如驗證是否是合法的郵件地址。
q 用來查找字符串,從一個長的文本中查找符合指定特征的字符串。
q 用來替換,比普通的替換更強大
工具軟件RegexBuddy的使用
n 為了提高開發效率,一般都先在工具軟件中測試正則表達式,通過測試后,才在程序中使用。
正則表達式規則
n 普通字符
q 字母、數字、漢字、下划線、以及沒有特殊定義的標點符號,都是“普通字符”。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。
n 簡單的轉義字符
\n |
代表換行符 |
\t |
制表符 |
\\ |
代表\本身 |
\^ ,\$,\.,\(, \) , \{, \} , \? , \+ , \* , \| ,\[, \] |
匹配這些字符本身 |
n 標准字符集合:能夠與 ‘多種字符’ 匹配的表達式
q (注意區分大小寫,大寫是相反的意思)
\d |
任意一個數字,0~9 中的任意一個 |
\w |
任意一個字母或數字或下划線,也就是 A~Z,a~z,0~9,_ 中任意一個 |
\s |
包括空格、制表符、換行符等空白字符的其中任意一個 |
. |
小數點可以匹配除了換行符(\n)以外的任意一個字符 |
n 自定義字符集合:[ ]方括號匹配方式,能夠匹配方括號中任意一個字符
[ab5@] |
匹配 "a" 或 "b" 或 "5" 或 "@" |
[^abc] |
匹配 "a","b","c" 之外的任意一個字符 |
[f-k] |
匹配 "f"~"k" 之間的任意一個字母 |
[^A-F0-3] |
匹配 "A"~"F","0"~"3" 之外的任意一個字符 |
注意事項:
1. 正則表達式中的特殊符號,如果被包含於中括號中,則失去特殊意義,但 \ [ ] : ^ - 除外。
2. 標准字符集合,除小數點(.)外,如果被包含於中括號中,自定義字符集合將包含該集合。
比如:[\d.\-+],將可以匹配數字,小數點和 + - 符號。(小數點和 + 號失去特殊意義)
n 修飾匹配次數的特殊符號
{n} |
表達式重復n次 |
{m,n} |
表達式至少重復m次,最多重復n次 |
{m,} |
表達式至少重復m次 |
? |
匹配表達式0次或者1次,相當於 {0,1} |
+ |
表達式至少出現1次,相當於 {1,} |
* |
表達式不出現或出現任意次,相當於 {0,} |
n 匹配次數中的貪婪模式(匹配字符越多越好)
q “{m,n}”, “{m,}”, “?”, “*”, “+”,具體匹配的次數隨被匹配的字符串而定。這種重復匹配不定次數的表達式在匹配過程中,總是盡可能多的匹配。
n 匹配次數中的非貪婪模式(匹配字符越少越好)
q 在修飾匹配次數的特殊符號后再加上一個 "?" 號,則可以使匹配次數不定的表達式盡可能少的匹配,使可匹配可不匹配的表達式,盡可能的 "不匹配"。
n 字符邊界(本組標記匹配的不是字符而是位置,符合某種條件的位置)
^ |
與字符串開始的地方匹配 |
$ |
與字符串結束的地方匹配 |
\b |
匹配一個單詞邊界 |
n 選擇符和分組
表達式 |
作用 |
| |
左右兩邊表達式之間 "或" 關系,匹配左邊或者右邊 |
( ) |
(1). 在被修飾匹配次數的時候,括號中的表達式可以作為整體被修飾 (2). 取匹配結果的時候,括號中的表達式匹配到的內容可以被單獨得到 (3). 每一對括號會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。捕獲元素編號為零的第一個捕獲是由整個正則表達式模式匹配的文本 |
n 反向引用(\nnn)
q 每一對()會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。
q 通過反向引用,可以對分組已捕獲的字符串進行引用。
n 非捕獲組(?:xxx)
q 與捕獲組的區別在於不捕獲匹配的文本,僅僅作為分組。其他地方一致。
n 模式修改符 (?ismg)*****(?-ismg) (用的不多,聽聽就行!)
q 在正則表達式中間,對匹配模式進行修改。
大小寫模式修改,比如匹配a,A:
- [aA]
- 把整個模式修改為大小寫不敏感。
- (?i)a(?-i)
n 預搜索(零寬斷言)
q 判斷當前位置的前后字符,是否符合指定的條件,但不匹配前后的字符。是對位置的匹配。
(?=exp) |
斷言自身出現的位置的后面能匹配表達式exp |
(?<=exp) |
斷言自身出現的位置的前面能匹配表達式exp |
(?!exp) |
斷言此位置的后面不能匹配表達式exp |
(?<!exp) |
斷言此位置的前面不能匹配表達式exp |
正則表達式的匹配模式
n IGNORECASE 忽略大小寫模式
q 匹配時忽略大小寫。
q 默認情況下,正則表達式是要區分大小寫的。
n SINGLELINE 單行模式
q 整個文本看作一個字符串,只有一個開頭,一個結尾。
q 使小數點 "." 可以匹配包含換行符(\n)在內的任意字符。
n MULTILINE 多行模式
q 每行都是一個字符串,都有開頭和結尾。
q 在指定了 MULTILINE 之后,如果需要僅匹配字符串開始和結束位置,可以使用 \A 和 \Z
開發中使用正則表達式的流程
- 分析所要匹配的數據,寫出測試用的典型數據
- 在工具軟件中進行匹配測試
- 在程序中調用通過測試的正則表達式
課堂練習
n 電話號碼驗證
q (1)電話號碼由數字和"-"構成
q (2)電話號碼為7到8位
q (3)如果電話號碼中包含有區號,那么區號為三位或四位, 首位是0.
q (4)區號用"-"和其他部分隔開
q (5)移動電話號碼為11位
q (6)11位移動電話號碼的第一位和第二位為"13“,”15”,”18”
n 電子郵件地址驗證
1.用戶名:字母、數字、中划線、下划線組成。
2.@
3.網址:字母、數字組成。
4. 小數點:.
5. 組織域名:2-4位字母組成。
6.不區分大小寫。
[a-zA-Z0-9_\-]+@[A-Za-z0-9]+(\.[a-zA-Z]{2,3}){1,2}
使用模式修改符:(?i)[a-z0-9_\-]+@[a-z0-9]+(\.[a-z]{2,3}){1,2}(?-i)