1. 程式人生 > 其它 >正則表示式詳解

正則表示式詳解

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、正則三問

  1. 查什麼:抓住要匹配的字串特徵 根據特徵 選用合適的正則符號
  2. 查多少:說明這種字元出現的次數 量詞 {} *+? {}?
  3. 在哪查:指定字元出現的位置 任意位置 緊跟 ^字串起始位置 $字串結束位置 \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、相關練習

  1. 匹配AABB格式的字串:1122,開開心心,!!@@

    p1:查什麼=任意字元,查多少=1個,在哪查=任意

    p2:查什麼=與P1相同,查多少=1個,在哪查=緊跟

    p3:查什麼=任意字元,查多少=1個,在哪查=緊跟

    p4:查什麼=與p3相同,查多少=1個,在哪查=緊跟

    /(.)\1(.)\2/g
    
  2. 匹配html標籤:

    p1:查什麼=<,查多少=1個,在哪查=任意

    p2:查什麼=字母,查多少=1個,在哪查=緊跟

    p3:查什麼=字母或數字,查多少=任意個,在哪查=緊跟

    p4:查什麼=>,查多少=1個,在哪查=緊跟

    p5:查什麼=任意字元,查多少=任意個,在哪查=緊跟

    p6:查什麼=</,查多少=1個,在哪查=緊跟

    p7:查什麼=與p2p3一樣,查多少=1個,在哪查=緊跟

    p8:查什麼=>,查多少=1個,在哪查=緊跟

    /<([a-z][a-z\d]*)>.*<\/\1>/i
    
  3. 匹配ABAAB格式的字串:12112

    p1:查什麼=任意字元,查多少=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、選擇匹配符結合子表示式

需求:匹配 hellophphellojava

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、多條件預查

  1. 需求:匹配一個含有小寫字母a的字串,***a***

    1

    p1:查什麼=任意字元,查多少=任意個,在哪查=任意

    p2:查什麼=a,查多少=1個,在哪查=緊跟

    p3:查什麼=任意字元,查多少=任意個,在哪查=緊跟

    /.*a.*/
    

    2

    p1:查什麼=任意字元,查多少=任意個,在哪查=任意

    p2:查什麼=a出現的預兆,查多少=1個,在哪查=緊跟

    p3:查什麼=任意字元,查多少=任意個,在哪查=緊跟

    /.*(?=a).*/
    
  2. 需求:匹配一個含有php的字串,***php***

    p1:查什麼=*php出現的預兆,查多少=1個,在哪查=任意

    p2:查什麼=任意字元,查多少=任意個,在哪查=緊跟

    /(?=^.*php).*/
    
  3. 需求:密碼驗證,要求密碼中必須包含大寫字母、小寫字母、數字,**A**b**1**

    p1:查什麼=大寫字母出現的預兆,(?=.*[A-Z])

    p2:查什麼=小寫字母出現的預兆,(?=.*[a-z])

    p3:查什麼=數字出現的預兆,(?=.*\d)

    /(?=.*[A-Z])(?=.*[a-z])(?=.*\d)/