博客列表 >正则表达式

正则表达式

一语笑嫣然
一语笑嫣然原创
2018年03月20日 15:05:49974浏览

作者:Code Diy
链接:https://www.zhihu.com/question/27793187/answer/92302029
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结篇1:正则表达式

目录

  • 正则表达式语法概述

    • 界定符

    • 语法组成    

  • 正则表达式数据结构

    • 常量字符

    • 变量字符

      • 简单变量字符

      • 字符类变量字符

  • 正则表达式逻辑控制

    • 匹配位置内容判断 

    • 匹配内容次数控制

    • 匹配内容获取与引用

    • 匹配模式修正

内容

  • 1 正则表达式语法
    正则表达式可以看做一种语法经过压缩的程序语言
    可以使用代码注释正则表达式的方法进行学习

  • 1-1 正则界定符

        正则表达式使用界定符包围正则字符串作为正则表达式的代码
        常见界定符"/","#","~"或者括号对 () [] {}

        代码解释:与php的<?php ,?>的开始结束标签相同

  /foo bar/      ; "/"界定符
  #^[^0-9]$#      ; "#"界定符
  +test+        ; "+"界定符
  %[a-zA-Z0-9_-]%    ; "%"界定符

        正则字符串中出现界定符时,需要使用反斜线"/"转义处理,

    /http:\/\//     ;"/"作为界定符,匹配http://时,"/"需要转义
    #http://#      ;"#"作为界定符,匹配http://时,"/"不需要转义

        可以在结束分隔符后面增加模式修饰符

  • 1-2 语法组成

        正则表达式中的语法分为数据结构逻辑控制

        数据结构:

        1 常量字符串 :普通字符组成
        2 变量字符串 :特殊字符组成

        逻辑控制:

        1 匹配内容获取与引用
        2 匹配位置内容判断
        3 匹配内容次数控制
        4 匹配逻辑或选择

  • 2  正则表达式数据结构

  • 2-1 常量字符串

        匹配常量字符串hello  

    "/hello/"

        匹配忽略大小写常量字符串 hello

    "/hello/i"
  • 2-2 变量字符串

  • 2-2-1简单变量字符: 使用 带有转义的单个特殊字符表示 

   \d    ;匹配一个数字字符             等价于[0-9]
   \D    ;匹配一个非数字字符            等价于[^0-9]
   \s    ;匹配一个任意空白字符           等价于[\n\r\t\v\f]
   \S    ;匹配一个任意非空白字符          等价于[^\n\r\t\v\f]
   \w    ;匹配一个字母/数字/下划线/汉字字符    等价于[A-Za-z0-9_]
   \W    ;匹配一个任意非单词字符          等价于[^A-Za-z0-9_]
   .     ;匹配一个 除换行\n外的任意字符      等价于[^\n]
   \n    ;匹配一个换行符  等价于\x0a和\cL
   \r    ;匹配一个回车符  等价于\x0d和\cM
   \t    ;匹配一个水平制表符 等价于\x09和\cI
   \v    ;匹配一个垂直制表符 等价于\x0b和\cK
   \f    ;匹配一个换页符  等价于\x0c和\cL

        匹配数字字符,空白字符,单词字符

    "/\d/" , "/\s/" , "/\w/"
  • 2-2-2字符类变量字符: 使用 []格式表示    

    [xyz]      ;匹配xyz其中一个字符
    [a-z]      ;匹配a到z其中一个字符
    [A-Z]      ;匹配A到Z其中一个字符
    [0-9]      ;匹配0到9其中一个字符
    [^xyz]      ;匹配除xyz以外的一个字符
    [^a-z]      ;匹配除a到z外的一个字符
  • 2-2-2字符类变量字符: 使用 []格式表示

  • 1 匹配位置内容判断

    ^x(exp)      ;判断字符串第一个字符是否为x    if (str.first_letter == x) {匹配}
    (exp)$x      ;判断字符串最后一个字符是否为x   if (str.last_letter == x) {匹配}   
    \bx(exp)     ;判断单词第一个字符是否是x     if (word.first_letter == x){匹配}
    (exp)y\b     ;判断单词最后一个字符是否是x    if (word.last_letter == x){匹配}
    (?<=exp)x      ;匹配前面是exp的x         if (x.prev == exp){匹配x}
    (?<!exp)x      ;匹配前面不是exp的x        if (x.prev != exp){匹配x}
    x(?=exp)      ;匹配后面是exp的x         if (x.next == exp){匹配x}
    x(?!exp)      ;匹配后面不是exp的x        if (x.next != exp){匹配x}
  多个判断组合
    或判断 (?<=bullock|donkey)x     匹配前面是bullock或者donkey的x
    且判断 (?<=\d{3})(?<!999)foo     匹配前面是3个数字而且不是999的foo
    嵌套判断 (?<=(?<!foo)bar)baz   嵌套判断匹配前面有 ”bar” 但是 ”bar” 前面没有 ”foo” 的 ”baz”。 
    嵌套判断 (?<=\d{3}…(?<!999))foo 匹配前面有三个数字字符紧跟 3 个不是 999 的任意字符的 ”foo”。
  • 2 匹配内容次数控制

    贪婪匹配:尽可能多匹配    
        x*       ;匹配零或多次个x字符        for(i=0;i>=0;i++){匹配x*i}        
        x+       ;匹配一次或多次个x字符       for(i=0;i>0;i++){匹配x*i}    
        x?       ;匹配零次或一次个x字符       for(i=0;0<=i<=1;i++){匹配x*i}    
        x{n}      ;匹配n次个x字符          for(i=0;i==n;i++){匹配x*i}    
        x{n,}     ;匹配n次或更多次个x字符       for(i=0;i>=n;i++){匹配x*i}    
        x{n,m}     ;匹配n到m次个x字符         for(i=0;n<=x<=m;i++){匹配x*i}
    懒惰匹配:尽可能少匹配    
        x*?       ;匹配零或多次个x字符       for(i=0;i>=0;i++){匹配x*i}        
        x+?       ;匹配一次或多次个x字符      for(i=0;i>0;i++){匹配x*i}    
        x??       ;匹配零次或一次个x字符      for(i=0;0<=i<=1;i++){匹配x*i}    
        x{n}?      ;匹配n次个x字符         for(i=0;i==n;i++){匹配x*i}    
        x{n,}?     ;匹配n次或更多次个x字符     for(i=0;i>=n;i++){匹配x*i}    
        x{n,m}?     ;匹配n到m次个x字符        for(i=0;n<=x<=m;i++){匹配x*i}
  • 3 匹配内容获取与引用

  • 3-1:普通分组

    (exp)         ;匹配exp变量,并存储到结果分组中   
    (\d)          ;匹配数字分组,并进行存储
    ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)                      
                ;匹配多个分组,并进行存储
  • 3-2: 命名分组

  (?<name>exp)     ;匹配exp变量,并存储到名称为name的结果分组中
  • 3-3: 一次性分组

  (?>exp)       ;尽可能长匹配exp变量,不对其内部进行匹配
  • 3-4:条件分组

  (?(conditon)yes-pattern|no-pattern)

    condition为数字,该数字代表的(之前的)子组得到匹配,使用yes_pattern,否则使用no-pattern
    condition为断言,断言成功使用yes-pattern,断言失败使用no-pattern

  • 4 正则模式修正


    \i   ;忽略大小写    
    \m   ;多行模式
    \s   ;单行模式



上一条:316作业下一条:第三课 form 表单
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议