美文网首页
正则表达式

正则表达式

作者: 白屏 | 来源:发表于2018-03-23 17:28 被阅读23次

    常用元字符

    元字符 说明 备注
    . 匹配除换行符以外的任意字符
    \w 匹配字母或数字或下划线或汉字 相当于[_a-z0-9A-Z]</br>匹配n个字符: \w{n}
    \s 匹配任意的空白符
    \d 匹配数字 匹配数字个数区间: \d{lower, upper}
    \b 匹配单词的开始或结束
    ^ 匹配字符串的开始
    $ 匹配字符串的结束

    反义

    元字符 说明
    \W 匹配任意不是字母,数字,下划线,汉字的字符
    \S 匹配任意不是空白符的字符
    \D 匹配任意非数字的字符
    \B 匹配不是单词开头或结束的位置
    [^x] 匹配除了x以外的任意字符

    常用限定符

    限定符 说明 备注
    * 重复零次或更多次 不代表任何字符,仅代表数量;</br>匹配0~n多个连续字符: \w*
    + 重复一次或更多次
    ? 重复零次或一次 代表某一个位置可有可无
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次

    分枝条件 ‘|’

    相当于或的意思,如“\d{5}-\d{4}|\d{5}”,可以匹配12345-1234,也可以匹配12345;特别需要注意的是,如果反过来写
    “\d{5}|\d{5}-\d{4}”的话,只能匹配前5个了,因为匹配规则从左到右,左侧规
    则匹配上就不会管右侧了
    

    分组 ‘()’

    分组用圆括号代表,所以不是分组的话,用到括号的地方需要转义;
    分组主要用于把同个匹配规则,重复多次

    例:

    ip地址简单配,匹配规则就是1~3位数组加“.”,重复4次
    
    (\d{1,3}\.){4}
    

    捕获

    使用分组()后,会自动为它分配一个组号,从1、2、3....,可以利用组号再表达式中继续匹配操作

    常用限定符

    分类 语法 说明
    自动捕获 (exp) 匹配exp,并捕获文本到自动命名组号,1、2、3...
    自定义组名 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
    不自动分配组名 (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号(应该没啥用)

    例:匹配连个连续一样的字符

    \b(\w+)\b\s+\1\b
    \1代表(\b(\w+)\b)匹配出来的结果,整个表达式就是要匹配连续出现2个相同连续的字符串
    

    捕获可以指定名称,不用自动生成的组号,指定名字‘Result’来改造:

    \b(?<Result>\w+)\b\s+\k<Result>\b
    

    断言

    分类 语法 说明
    零宽度正预测先行断言 (?=exp) 匹配exp前面的位置
    零宽度正回顾后发断言 (?<=exp) 匹配exp后面的位置
    零宽度负预测先行断言 (?!exp) 匹配后面跟的不是exp的位置
    零宽度负回顾后发断言 ((?<!exp)) 匹配前面不是exp的位置
    • 用于断定某些位置会出现哪些字符,但是结果中不会包含被断定的这些内容;
    • (?=exp)只能放开头,(?<=exp)只能放结尾
    样本:"I'm singing while you're dancing"
    规则:\b\w+(?=ing)
    结果:sing和danc
    
    样本:"reading a book"
    规则:(?<=\bre)\w+\b
    结果:ading
    
    • 负向零宽断言本身不占匹配位置,只是确保会出现哪些字符
    样本:"Iraq fighting"
    规则:\b\w*q[^u]\w*\b
    结果:Iraq fighting
    
    想要确定q后面不能紧跟着u,但是以上没做到,应该用以下规则
    规则:\b\w*q(?!u)\w*\b
    
    
    规则:(?<![a-z])\d{7}
    作用: 匹配前面不是小写字母的七位数字
    
    

    注释

    小括号的另一种用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
    

    贪婪与懒惰模式

    样本:"aabab"
    规则:a.*b
    结果:aabab
    

    ==为什么不是“aab”、“ab”?==

    默认是贪婪模式,尽可能匹配更多的字符。
    如果改写成
    
    样本:"aabab"
    规则:a.*?b
    结果:aabab
    
    加上?就会变成懒惰模式,匹配尽可能少的字符
    
    
    语法 说明
    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复

    由于不常用容易忘记,所以记录下;本文主要用于自己忘记的时候快速才看规则,如果想比较快速系统的学习正则表达式,可以到这里正则表达式30分钟入门教程学习,作者写的很不错,我在不同时间段总共看了第三遍了,忘了看看了忘,每次都有收获

    相关文章

      网友评论

          本文标题:正则表达式

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