Day5--RE

作者: 东方不赞 | 来源:发表于2020-03-31 21:12 被阅读0次

    正则表达式

    引用自https://mp.weixin.qq.com/s/CBexZfG1DHYji_Pk6Zo38w

    1. 元字符

    元字符 意义 反义的表达
    . 匹配除换行符外所有字符
    \w 字母、数字、下划线、汉字 \W
    \s 任意空白符 \S
    \d 数字 \D
    \b 单词的开始或结束 \B
    ^ 字符串的开始 [^]
    $ 字符串的结束

    示例

    匹配有 abc 开头的字符串

    \babc或^abc  
    

    匹配8位数字的QQ号码

    ^\d\d\d\d\d\d\d\d
    

    匹配1开头的手机号码

    ^1\d\d\d\d\d\d\d\d\d\d
    

    2. 重复限定符

    为了解决上面示例的冗余,使用重复限定符

    语法 重复次数
    ? 0或1次
    * 0或多次
    + 1或多次
    {n} n次
    {n,} n或更多
    {n,m} n到m次

    示例

    匹配8位数字的QQ号码

    ^\d{8}$
    

    匹配1开头的手机号码

    ^1\d{10}$
    

    匹配银行卡号是14~18的数字

    ^\d{14,18}$
    

    匹配以a开头,0个或多个b结尾的字符串

    ^ab*$
    

    3. 分组、转义、条件或、区间

    3.1 使用小括号进行分组

    匹配以0或多个ab开头的字符串

    ^(ab)*
    

    3.2 对小括号进行转义

    匹配以0或多个(ab)开头的字符串

    ^(\(ab\))*
    

    3.3 条件或:|

    匹配联通手机号(联通手机号前三位: 130/131/132/155/156/185/186/145/176 )

    ^(130|131|132|155|156|185|186|145|176)\d{8}$
    

    3.4 对上式化简,可以使用区间工具

    区间 限定
    [0-9] 0到9
    [165] 1,5,6
    [A-C] A到C
    [AC] A,C

    化简上式

    ^(13[0-2]|15[56]|18[56]|145|176)\d{8}$
    

    4. 零宽断言

    • 断言判断字符串是否有pattern
    • 零宽指断言不占长度
    • 注意,字符串的前后:------后-----point--->---前-------
    名称 表达式 备注
    正向先行断言 ***(?=pattern) 与pattern匹配则返回***
    正向后行断言 (?<=pattern)*** 与pattern匹配则返回***
    负向先行断言 ***(?!pattern) 负向指“非”,与pattern不匹配则返回***
    负向后行断言 (?<!pattern)*** 负向指“非”,与pattern不匹配则返回***

    示例

    #匹配"<span class="read-count">阅读数:641</span>"中的641
    \d+(?=</span>)  #正向先行断言
    (?<=<span class=\"read-count\">阅读数:)\d+  #正向后行断言
    #“我爱祖国,我是祖国的花朵”
    祖国(?!的花朵)  #负向先行断言,匹配不是'的花朵'的祖国
    (?<!我是)祖国  #负向后行断言,匹配不是“我是”的祖国
    

    5. 捕获与非捕获

    捕获组:匹配子表达式的内容,把匹配结果保存到内存中中数字编号或显示命名的组里,以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果

    5.1 数字编号捕获组:(expression)

    • 比如固定电话020-85653333的正则表达式为:(0\d{2})-(\d{8})
    序号 编号 分组 内容
    0 0 (0\d{2})-(\d{8}) 020-85653333
    1 1 (0\d{2}) 020
    2 2 (\d{8}) 85653333

    5.2 命名编号捕获组: (?<name>expression)

    • 固定电话020-85653333的正则表达式为:(?<quhao>\0\d{2})-(?<haoma>\d{8})
    序号 名称 分组 内容
    0 0 (0\d{2})-(\d{8}) 020-85653333
    1 quhao (0\d{2}) 020
    2 haoma (\d{8}) 85653333

    5.3 非捕获:(?:expression)

    • 标识那些不需要捕获的分组 ,可以用(?:\0\d{2})-(\d{8})不捕获原来的第一组
    序号 编号 分组 内容
    0 0 (0\d{2})-(\d{8}) 020-85653333
    1 1 (\d{8}) 85653333

    6. 反向引用

    捕获会返回一个捕获组,并保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用

    • 常用于查找一些重复的内容替换指定字符

    示例

    查找一串字母"aabbbbgbddesddfiid"里成对的字母

    思路:

    • \w
    • (\w) #捕获
    • (\w)\1 #调用捕获第1组,若是命名捕获,也可用\"name"调用

    7. 贪婪与非贪婪

    7.1 贪婪

    贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。

    文本:61762828 176 2991 44 871
    贪婪模式:\d{3,6}#假如字符串里有6个数字可以匹配,那它会全部匹配到。
    匹配结果:617628
    匹配结果:176
    匹配结果:2991
    匹配结果:871
    

    7.2 贪婪之间的优先度

    • 多个贪婪时,如果字符串能满足他们各自最大程度的匹配时,就互不干扰
    • 不能满足时,根据深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配
    文本:61762828 176 2991 87321
    贪婪模式:(\d{1,2})(\d{3,4})
    匹配结果:617628
    匹配结果:2991
    匹配结果:87321
    

    7.3 非贪婪(懒惰)

    懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配。

    代码 说明
    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复
    文本:61762828 176 2991 87321
    贪婪模式:(\d{1,2}?)(\d{3,4})
    匹配结果:61762
    匹配结果:2991
    匹配结果:87321
    

    相关文章

      网友评论

        本文标题:Day5--RE

        本文链接:https://www.haomeiwen.com/subject/hngguhtx.html