準備: —安裝RegExpBuddy軟體——專門測試正則表達式是否正確的軟體 —或是找一個正則表達式線上測試網站 1.正則表達式——Regular Expression 什麼是: 正則表達式,是專門描述字元串中字元出現規則的表達式。 為什麼: 因為程式不認識人類語言中的辭彙,所以才需要程式員用正則表 ...
準備:
—安裝RegExpBuddy軟體——專門測試正則表達式是否正確的軟體
—或是找一個正則表達式線上測試網站
1.正則表達式——Regular Expression
什麼是:
正則表達式,是專門描述字元串中字元出現規則的表達式。
為什麼:
因為程式不認識人類語言中的辭彙,所以才需要程式員用正則表達式教程式認識人類語言中的辭彙。
可用於:
1.驗證字元串格式
2.查找敏感詞
定義正則表達式:
(1).普通字元
所有的單個大小寫字母、數字都是一個正則表達式,用以匹配單個字元,這個字元與它本身相同,簡單來講,就是一個關鍵詞原文。
—例如:"我是"
關鍵詞匹配的過程:
在RegExp Buddy中
—查找一句話中是否包含敏感詞“我是”
—如果將一句話中的“我是”,換成“我事”,還能查詢出來嗎?
(2).字元集
問題:
第二個字元換成另一個同音字,就匹配不到了
解決:
字元集
什麼是:
—字元集是規定一位字元上多種備選字的列表
—只要規則中某一位字元上有多種備選字時,就用字元集
如何:
[備選字列表]
例如:
匹配時,只要與[]中任意一個字元匹配,就算滿足規則
字元集匹配過程:
如果再連上前邊寫死的“我”字規則,可匹配三種詞:
在RegExp Buddy中
—定義一個規則同時匹配“我是” ,“我事” ,“我時” 三種敏感詞
答案: 我[是時事]
—擴展:修改規則,使其進一步匹配“卧是”
答案: [我卧][是時事]
—[我卧][是事時]匹配過程:
再例如:
常用手機號規則:
— 第一位:1
— 第二位:3、4、5、6、7、8、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 邊界