正則表示式詳解
1、正則表示式構成
簡介:描述了一種字串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
構成:/正則表示式/匹配模式
1.1、普通字元與元字元
- 匹配手機號中,是否含有字母a /a/ 像a這種含義與字面意義一樣的字元,叫普通字元
- 匹配手機號中,是否需含有非數字 /\D/ 像\D這種含義與字面意義不同的字元,叫元字元
1.2、常用元字元
- \d: 數字
- \D: 非數字
- \w: 單詞字元word 大寫字母、小寫字母、下劃線_、數字
- \W: 非單詞字元
- \s: 空白字元 空格、換行符、製表符tab 看不見但又真實存在的字元
- \S: 非空白字元
1.3、特殊符號
- ^:行開頭
- ():定義子表示式
- []: 構建範圍 [13579]
- {}:表示匹配的長度,{3}3個字元長度,{6,9}6-9個字元長度
- [^]:表達取反,如:匹配偶數 [24680] 或 [ ^13579]
- +:出現至少1次
- .:任意字元,除換行和回車之外
- *:任意次數
- ?:出現0或1次
- (.\d+)?:括號裡內出現0或1次
- $:行結尾
1.4、匹配模式
- g:global 全域性匹配 嘗試在字串的所有位置進行匹配
- i:ignore 忽略大小寫 在匹配時,可以忽略大小寫
1.5、正則三問
- 查什麼:抓住要匹配的字串特徵 根據特徵 選用合適的正則符號
- 查多少:說明這種字元出現的次數 量詞 {} *+? {}?
- 在哪查:指定字元出現的位置 任意位置 緊跟 ^字串起始位置 $字串結束位置 \b單詞邊界 \B非單詞邊界
2、子表示式
2.1、定義子表示式
-
需求:匹配連續4位相同數字
三問:查什麼=數字\d,查多少=4位,在哪查=任意位置
-
分析:
-
p1:先查出1個數字,
-
p2:再查後面3個數字與p1相同
/(\d)\1{3}/g #說明 ():定義子表示式 \d:數字 \1:第1個子表示式,即(\d) {3}:出現3次 g:全域性匹配,在字串的所有位置進行匹配
-
-
子表示式:/(子表示式1)(子表示式2)(子表示式3)/
子表示式1=\1,子表示式2=\2,子表示式3=\3
2.2、相關練習
-
匹配
AABB
格式的字串:1122,開開心心,!!@@p1:查什麼=任意字元,查多少=1個,在哪查=任意
p2:查什麼=與P1相同,查多少=1個,在哪查=緊跟
p3:查什麼=任意字元,查多少=1個,在哪查=緊跟
p4:查什麼=與p3相同,查多少=1個,在哪查=緊跟
/(.)\1(.)\2/g
-
p1:查什麼=<,查多少=1個,在哪查=任意
p2:查什麼=字母,查多少=1個,在哪查=緊跟
p3:查什麼=字母或數字,查多少=任意個,在哪查=緊跟
p4:查什麼=>,查多少=1個,在哪查=緊跟
p5:查什麼=任意字元,查多少=任意個,在哪查=緊跟
p6:查什麼=</,查多少=1個,在哪查=緊跟
p7:查什麼=與p2p3一樣,查多少=1個,在哪查=緊跟
p8:查什麼=>,查多少=1個,在哪查=緊跟
/<([a-z][a-z\d]*)>.*<\/\1>/i
-
匹配
ABAAB
格式的字串:12112p1:查什麼=任意字元,查多少=1個,在哪查=任意
p2:查什麼=任意字元,查多少=1個,在哪查=緊跟
p3:查什麼=與p1相同,查多少=2個,在哪查=緊跟
p4:查什麼=與p2相同,查多少=1個,在哪查=緊跟
/(.)(.)\1{2}\2/g
3、選擇匹配符
3.1、使用選擇匹配符
需求:匹配 xiaobai
或者 xiaohong
/xiaobai|xiaohong/g
#使用選擇匹配符 | 來表達選擇性質的需求
需求:捕獲小寫字母a或b或c
/[abc]/g
或
/a|b|c/g
3.2、選擇匹配符結合子表示式
需求:匹配 hellophp
或 hellojava
p1:查什麼=hello,查多少=1個,在哪查=任意
p2:查什麼=php或java,查多少=1個,在哪查=緊跟
/hello(php|java)/gi
4、預查
4.1、正向預查
需求:匹配在php左邊3個數字,123php,456php
正向預查語法:(?=要前瞻的字元)
p1:查什麼=數字,查多少=3個,在哪查=任意
p2:查什麼=是php預兆,查多少=1個,在哪查=緊跟
/\d{3}(?=php)/g
4.2、正向預查取反
需求:匹配不在php左邊3個數字
正向預付取反語法:(?!要匹配的字元)
p1:查什麼=數字,查多少=3個,在哪查=任意
p2:查什麼=不是php預兆,查多少=1個,在哪查=緊跟
/\d{3}(?!php)/g
4.3、預查捕獲
需求:捕獲php左邊的三位數字,並且把php本身也捕獲出來
預查捕獲:(?:要預查的字元)
/\d{3}(?:php)/g
4.4、選擇性預查
需求:捕獲php或者java左邊的3位數字
p1:查什麼=數字,查多少=3個,在哪查=任意
p2:查什麼=php或java,查多少=1個,在哪查=緊跟
/\d{3}(?=php|java)/g
4.5、多條件預查
-
需求:匹配一個含有小寫字母a的字串,
***a***
1
p1:查什麼=任意字元,查多少=任意個,在哪查=任意
p2:查什麼=a,查多少=1個,在哪查=緊跟
p3:查什麼=任意字元,查多少=任意個,在哪查=緊跟
/.*a.*/
2
p1:查什麼=任意字元,查多少=任意個,在哪查=任意
p2:查什麼=a出現的預兆,查多少=1個,在哪查=緊跟
p3:查什麼=任意字元,查多少=任意個,在哪查=緊跟
/.*(?=a).*/
-
需求:匹配一個含有php的字串,
***php***
p1:查什麼=*php出現的預兆,查多少=1個,在哪查=任意
p2:查什麼=任意字元,查多少=任意個,在哪查=緊跟
/(?=^.*php).*/
-
需求:密碼驗證,要求密碼中必須包含大寫字母、小寫字母、數字,
**A**b**1**
p1:查什麼=大寫字母出現的預兆,
(?=.*[A-Z])
p2:查什麼=小寫字母出現的預兆,
(?=.*[a-z])
p3:查什麼=數字出現的預兆,
(?=.*\d)
/(?=.*[A-Z])(?=.*[a-z])(?=.*\d)/