正则表达式


特殊符号读音
@表示英语单词at,对可以上网的人来说是“在线”的意思;
$表示英语单词dollar,意思是美元,它是美元的符号;
&表示英语单词and,“和”的意思,相当于汉语中的连词.
^ caret [ˈkærət]



特别提示:正则表达式与文件通配语法无关,比如 *.xml


基础:
    \b  单词的开头或者结尾, 匹配空格,换行,逗号,句号其中的某一个
    .   匹配除了换行之外的任意一个字符.
    *   前面的内容可以重复0次或者多次.
        如: .* 匹配多个任意字符(完全没意义)
            za* 匹配za zaa zaaaa z 等
            a(za) 匹配 aza azaza azazazaza a 等
    \d  匹配任意一位数组 0-9
    \d{8} \d 这种类型的字符连续重复8次 
    \s   记得是小写s 匹配任意空白符 如 空格,制表符(tab),换行符,中文全角空格等
    \w    也是小写w 匹配字母,数字,下划线,汉字
    +   匹配1个或者多个, *是0个或者多个,意义完全一样
    ^   匹配字符串的开始 
    $   匹配字符串的结束
        > 关于 ^ 和 $  被这两个字符包含的匹配条件, 要求输入的所有字符串必须满足我们的匹配条件, 而没有被这两个字符包含的匹配条件, 意思相当于在一个字符串中查找合法的字符串.
        简单的来讲:
        被包含:整个字符串必须满足匹配条件
        没有被包含:整个字符串 中含有满足匹配条件的字符
    字符转义: 如果我们就是要匹配这些特殊字符 如元字符 * , \ , . , ? ,等 我们需要转义字符. 就是给这些特殊字符前面加反斜杠\ 如 \* \\ \. \? 

    关于字符重复
        * 0次或多次
        + 1次或者多次
        ? 1次或者0次
        {n} n次
        {n,} 大于等于n次
        {n,m}  大于等于n次 或者小于定义m次
    匹配指定字符
        如匹配元音字母  a e i o u  为: [aeiou]
        如匹配表达符号 . ? !        为: [.?!]
        匹配0-9中某个数组           为:[0-9] = \d
        匹配a-z中某个字母           为:[a-z]
        只要满足中括号[]中的字符的某一个就可以了

     匹配电话号:
    \(?0\d{2}[) -]?\d{8}
    分析:     \(?             左边小括号( 出现一次或者0次
            0\d{}           0开头后面接两个数字
            [) -]?          ) 空格 和 - 中的一个 出现 1次或者 0次
            \d{8}           连续8个数字

    座机 其他匹配方法
    0\d{2}-\d{8}|0\d{3}-\d{7}
        匹配 三位区号 021-98767876
        匹配 四位区号 0934-9876787

    分支条件
        可以用字符 | 创建分支条件,如 "条件1 | 条件2" 
        当满足条件1或者条件2时 匹配成功
            注意:如果条件1和条件2同时满足,只匹配条件1, 从左到右匹配, 左边的条件满足后,不再管右边的条件.
        例: 匹配美国邮政编码. 1. 可以是5位数字 2.可以是连字号间隔的9位数
        正确写法: d{5}-d{4}|\d{5}
        错误写法: d{5}|d{5}-d{4} 当要匹配的数字是大于 5 位 数字,小于8位数字时,这些数字都不是正确的邮编,但是他满足匹配条件 d{5}, 这里满足了条件d{5} 就不会再去验证 d{5}-d{4} 所以, 该写法是错误的

    分组
        用小括号包含的匹配字符可以当做一个整体(分组),可以对这个组加重复条件
        如:匹配 ip 地址  (\d{1,3}\.){3}\d{1,3}
            但是这个表达式也会匹配 256.300.888.999 这种非法ip
        正确匹配ip:   ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[]0-4)\d|25[0-5]|[01]?\d\d?)

    反义: 查找不是某种类型的字符.
        \W 大写的W , 是\w(小写)的反义词, 匹配任意不是字母,数字,下划线,汉字的字符
        \S 大写的S , 是\s(小写)的反义词, 匹配任意不是空白符的字符
        \D 大写的D , 是\d(小写)的反义词, 匹配非数字的字符
        \B 大写的B , 是\b(小写)的反义词, 匹配不是开头或者结尾的字符
        [^x] 匹配除了x 之外的任意字符
        [^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符
    后向引用
        每一个分组都有一个默认的组号,从左到右分别是 1, 2, 3, ...
        如 \1 就是分组一的文本, \2 就是分组2的文本
        如: \b(\w+)\b\s+\1\b  这里 \1=(\w+)  用来匹配重复单词 如: go go 或者 kitty kitty
        指定组名: (?<组名>\w+) 或者 (?'组名'\w+)
                 要引用这个组,可以写: \k<组名>
                 上个例子可以写作: \b(?\w+)\b\s+\k\b 匹配重复数

    零宽断言: 用于查找某些内容(不包括这些内容)之前或者之后的东西.用于指定一个位置
    正先行断言:    在字符串相应位置之前进行查找匹配,使用(?=exp)匹配前面的位置.
    (?=exp)     1.判断 exp 是否存在
                2.如果存在,则 匹配exp 之前的位置
            如:原始字符串: "abcgwcab"
                正则: bc(?=gw)
                结果: bc
                解析: 首先查找 字符串 abcgwcab 中是否有 字符串 gw 
                      有gw 则在gw 之前去匹配bc 
    反先行断言: 正好跟正先行断言相反, 断言 exp 前面匹配的字符在原始
               字符串中后面的字符不是exp 
    (?!exp) 
                如:
                原始字符:abcgwcab
                正则:   bc(?!ww)gw
                结果: bcgw
                解析: 先找到bc 看看bc后面的字符是gw != ww  所以满足条件, gw 正好和gw 匹配.
    正后发断言: 在字符串 exp 位置之后进行匹配 
    (?<=exp)
               如:
               原始字符串: abcgwcab
               正则: (?<=gw)ca
               结果: ca
               解析: 先找 gw 在不在, 然后匹配gw 后面是不是ca 
    反后发断言: 跟正后发断言相反 具体看事例  
    (? # 查找尖括号括起来的字母或数字(即HTML/XML标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?=     # 断言要匹配的文本的后缀
      <\/\1>  # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
      )       # 后缀结束

      贪婪和懒惰
      贪婪: 一个正则表达式的行为匹配尽可能多的字符,如:
            a.*b 会匹配最长的以a开始,以b结束的字符串. 用来搜索aabab 匹配结果是整个字符串 aabab , 称为贪婪匹配
      懒惰: 匹配尽可能少的字符, 在任何限定符后面加上问好?,这就是懒惰匹配,如: a.*?b 意味着匹配任意数量的字符串,如果用来匹配 aabab 他会匹配 aab(第一道第三个字符)和ab(第四和第五个字符).
            为什么先匹配的是 aab 而不是 ab 呢, 因为最先开始的匹配拥有最高的优先权.

            *? 重复任意次, 但尽可能少重复
            +? 重复1次或更多次,但尽可能少重复
            ?? 重复0次或者1次,但尽可能少重复
            {n,m}? 重复n到m次,但尽可能少重复
            {n,}?重复n次以上, 但尽可能少重复






  • 正则表达式30分钟入门教程
  • 30分钟学会正则表达式

你可能感兴趣的:(正则表达式)