正则表达式详解

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)/
    
posted @ 2021-08-20 16:27  pine007  阅读(195)  评论(0编辑  收藏  举报