準備:git
—安裝RegExpBuddy軟件——專門測試正則表達式是否正確的軟件程序員
—或是找一個正則表達式在線測試網站正則表達式
1.正則表達式——Regular Expression測試
什麼是:網站
正則表達式,是專門描述字符串中字符出現規則的表達式。spa
爲何:blog
由於程序不認識人類語言中的詞彙,因此才須要程序員用正則表達式教程序認識人類語言中的詞彙。教程
可用於:圖片
1.驗證字符串格式字符串
2.查找敏感詞
定義正則表達式:
(1).普通字符
全部的單個大小寫字母、數字都是一個正則表達式,用以匹配單個字符,這個字符與它自己相同,簡單來說,就是一個關鍵詞原文。
—例如:"我是"
關鍵詞匹配的過程:
在RegExp Buddy中
—查找一句話中是否包含敏感詞「我是」
—若是將一句話中的「我是」,換成「我事」,還能查詢出來嗎?
(2).字符集
問題:
第二個字符換成另外一個同音字,就匹配不到了
解決:
字符集
什麼是:
—字符集是規定一位字符上多種備選字的列表
—只要規則中某一位字符上有多種備選字時,就用字符集
如何:
[備選字列表]
例如:
匹配時,只要與[]中任意一個字符匹配,就算知足規則
字符集匹配過程:
若是再連上前邊寫死的「我」字規則,可匹配三種詞:
在RegExp Buddy中
—定義一個規則同時匹配「我是」 ,「我事」 ,「我時」 三種敏感詞
答案: 我[是時事]
—擴展:修改規則,使其進一步匹配「臥是」
答案: [我臥][是時事]
—[我臥][是事時]匹配過程:
再例如:
經常使用手機號規則:
— 第一位:1
— 第二位:三、四、五、六、七、八、9中選其中一個
— 後 9位:每一位上都是在0~9數字之間任選其一
—結果:
問題:
若是每一個數字都寫很麻煩。
解決:
簡寫:若是[]中部分備選字符連續,可使用-省略中間字符
例如:
手機號規則中:
[3456789] 可簡寫爲 [3-9] 讀做 3到9
[0123456789] 可簡寫爲 [0-9] 讀做 0到9
因此,手機簡寫形式:
1[3-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
其它簡寫:
要匹配 一位小寫 字母 : [a-z] 共26個
要匹配 一位大寫 字母 : [A-Z] 共26個
要 匹 配 一 位 字 母 : [A-Za-z] 共52個
要匹配一位字母或數字:[0-9A-Za-z] 共62個
要 匹 配 一 位 漢 字:[\u4e00-\u9fa5]
19968 ~ 40869 共20902個
使用字符集簡寫:
在RegExp Buddy中
—利用字符集簡寫定義車牌號規則:
— 第一位:1位漢字
— 第二位:1位大寫字母
— 第三位:·
— 後五位:每一位都是一位大寫字母或數字
—答案:
[\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]
(3).預約義字符集
正則表達式語法爲四種最經常使用的字符集定義了最簡化寫法,稱爲預約義字符集。
包括:
要 匹 配 一 位 數 字 : \d 等效於 [0-9]
要匹配一位字母、數字或_: \w 等效於 [0-9A-Za-z_]
要 匹 配 一 位 空 字 符 :\s 可匹配 空格、製表符、Tab等空白
要匹配全部文字 (通配符) : .
因此,利用預約義字符集簡寫手機號規則爲:
1[3-8]\d\d\d\d\d\d\d\d\d
問題:
手機號規則中\d寫了9遍,車牌號規則中[0-9A-Z]也寫了五遍,也很不方便。
緣由:
一個字符集(\d或[0-9])只能匹配一位字符,要匹配9位字符,就必須重複寫9遍。
程序用規則匹配字符串,就像彩票兌獎同樣,是逐字逐個規則匹配。
不但內容要符合規則,位數首先要一致。
[\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]
解決:
使用數量詞。
(4).數量詞
什麼是:
數量詞,是專門規定一個字符集出現次數的規則
什麼時候:
從此,只要一個字符集在規則中可能連續反覆出現屢次,就要用數量詞以簡寫方式定義出現次數。
如何:
數量詞緊跟在其修飾的字符集以後,默認修飾相鄰的前一個字符集
例如:
利用數量詞進一步簡寫手機號規則中,可進一步簡寫爲:
1[3-8]\d{9} \d{9} 至關於 \d*9次
使用數量詞:
利用數量詞進一步簡寫車牌號規則,可進一步簡寫爲:
[\u4e00-\u9fa5][A-Z]·[0-9A-Z]{5}
問題:
接收短信驗證碼時,網站驗證碼有時4位,有時6位,並不肯定,怎麼辦?
其實,數量詞包括兩大類:
1). 有明確數量邊界的數量詞
字符集{n} 表示字符集必須重複n次,不能多也不能少
例如:
\d{4,6} 表示4位數字
字符集{n,m} 表示字符集至少重複n次,最多重複m次,
例如:
\d{4,6} 表示4到6位數字
字符集{n,} 表示字符集匹配的內容至少重複n次,多了不限
例如:
\d{6,} 表示6位以上數字
2). 沒有明確數量邊界的數量詞
* 表示無關緊要,多了不限
\s*
+ 表示至少一次,多了不限
\s+
? 表示無關緊要,最多一次
\s?
在RegExp Buddy中
—匹配手機短信中的驗證碼:連續的4位~6位數字
答案: \d{4,6}
—匹配字符串中的一組連續空字符
答案: \s+
(5).選擇和分組
問題:
屏蔽敏感詞時,輸入者把字換成拼音就查不出來了
錯誤的作法:
直接將拼音放入[]中做爲字符集中的備選
好比:
[草cao]
但願:
草 或 cao
緣由:
字符集只認識單個字,不認識一組拼音
正確作法:
1).選擇
什麼是:
選擇,是指在多個子規則中選其一匹配
什麼時候:
從此,只要在多個子規則中選其一匹配時,就用選擇
如何:
子規則1 | 子規則2
讀做:
知足規則1 或 知足規則2
例如:
草 | cao
問題:
若是規則寫成「我草|cao」 呢?
但願是:
我草 或 我cao
實際倒是:
我草 | cao
緣由:
由於「|」選擇符只分左右,不考慮單個字符
解決:
使用分組。
2).分組
什麼是:
分組,將多個子規則視爲一組,再和分組外的規則匹配
什麼時候:
只要但願將多個子規則視爲一個總體,再和其它規則匹配時,就用分組
如何:
其它規則(多個子規則)
例如:
—匹配一個「草」 字或「cao」這個拼音
答案: 草|cao
—匹配「我草」或「我cao」
答案: 我(草|cao)
使用選擇和分組:
問題1:
同時驗證敏感字同音字或拼音,我草、我艹、我cao、我槽
答案:我 ([草艹槽]|cao)
問題2:
「我」 字也多是「臥」或「wo」
答案:([我臥]|wo)([草艹槽]|cao)
問題3:
可能在中間加不肯定個數的空字符:
答案:([我臥]|wo)\s*([草艹槽]|cao)
在RegExp Buddy中定義規則
—匹配「我草」
—匹配 「臥 槽」
—匹配 「wocao」,「我 草」等敏感詞
—定義完整手機號規則:
分析:
+86或0086:(\+86|0086)
至少一個空字符 : \s+
以前全部,總體無關緊要,最多一次: ()?
1
3~9
任選其一 9位數字
答案: ((\+86|0086)\s+)?1[3-8]\d{9}
—定義完整身份證號規則:
分析:
15位數字: \d{15} (一代身份證)
2位數字: \d\d
最後一位: 1位數字或Ⅹ: [0-9Ⅹ]
最後三位 無關緊要,最多一次 (最後三位)?
答案:\d{15}(\d\d[0-9x])?
(6).指定匹配位置
一個字符串中三個位置比較特殊:
—1. 字符串開頭
—2. 字符串結尾
—3. 英文句子中的每一個單詞中間的空白位置
若是隻但願匹配特殊位置上的關鍵詞時,就可用特殊符號表示特殊位置。
包括:
—1. ^ 表示字符串開頭
—2. $ 表示字符串結尾
—3. \b 表示單詞邊界,可匹配:空格,標點符號,字符串開頭和結尾等可將一個單詞與其它單詞分割開的符號。
例如:
匹配一組連續的空字符
—1. 匹配任意一組連續的空字符
—2. 僅匹配開頭的空字
—3. 僅匹配結尾的空字符
—4. 同時匹配開頭和結尾的空字符:
錯誤的作法:
^\s+$,表示從開頭到結尾之間只能是空字符!
正確作法:
用「|」選擇符,將整個規則強行一分爲2
再好比:
找到每一個單詞首字母
—前邊緊挨着單詞邊界的字母
附圖片(不與博客內容匹配,僅參考):
英文單詞整理Regular Expression 正則表達式Regular 規則Expression 表達式 作一件事的一條程序的語句\d digit (從 0 到 9 的任何一個)數字,數位\s space (可利用的)空地,空間;空格\w word 單詞;詞;字;\b boundary 邊界