正则表达式五分钟快速复习

项目小版本上线偷得半日闲,刚刚又重新看了一遍正则,这次有空仔细看,完全理解了一遍,收获很大,下面整理一下

  1. 总体

    1. 正则其实非常简单,没有太多东西,就只有几个组成部分:表示字符/表示数量/表示位置/其他
    2. 不过确实正则可读性非常差,我觉得首要原因就是组成成分混乱,所以我的技巧是分两步,第一步是断句,第二步是理解,断句非常重要
  2. 表示字符
    1. 普通字符

      1. 任意字符(元字符需要转义)(空格也是直接匹配)
    2. 元字符(匹配一类字符)
      1. . -匹配除换行符以外的任意字符
      2. \w -匹配字母或数字或下划线或汉字(word)
      3. \s -匹配任意的空白符(skip)
      4. \d -匹配数字(digit)
    3. 表达式
      1. [-]反括号能匹配里边的元素,能通过-表示一个范围
      2. 举例
        1. [aeiou]就匹配任何一个英文元音字母
        2. [.?!]匹配标点符号(.或?或!)
        3. [0-9]代表的含意与\d就是完全一致的:一位数字
        4. [a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)
  3. 表示数量(限定符)
    1. 元字符

      1. * -重复零次或更多次
      2. + -重复一次或更多次
      3. ? -重复零次或一次
    2. 表达式
      1. {n} -重复n次
      2. {n,} -重复n次或更多次
      3. {n,m} -重复n到m次
    3. 贪婪/懒惰
      1. 看着高大上但是很简单的概念,用起来也非常简单,就一个字符
      2. 在限定符后边加一个?就意味着从贪婪匹配变成了懒惰匹配
      3. 当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符
        1. 以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串
        2. 如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配
      4. 有时我们更需要懒惰匹配,也就是匹配尽可能少的字符
        1. 比如 .*? 就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复
  4. 表示位置
    1. 都是元字符,没几个
    2. \b -匹配单词的开头或结尾,它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w  (begin)
    3. ^ -匹配字符串的开始
    4. $ -匹配字符串的结束
  5. 零宽断言
    1. 它跟表示位置有点类似的地方,有人直接认为它就是表示位置的一种方法,但我不这么认为,我认为它不一样的原因是它可以截取字符串
    2. 它本身还有一个特殊属性是,它不会占有匹配位,也就是它不会匹配掉字符,而前面的匹配字符和匹配位置都是会匹配掉字符的(结合表示位置的元字符理解更佳)
    3. 表达式
      1. (?=exp) -匹配exp前面的位置

        1. 断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
      2. (?<=exp) -匹配exp后面的位置
        1. 断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分)
      3. (?!exp) -匹配后面跟的不是exp的位置
        1. 断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字
      4. (?<!exp) -匹配前面不是exp的位置
        1. 断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字
  6. 其他
    1. 元字符和转义字符

      1. 这块我觉得正则做得不太好,<有意义,但是却不是转义字符,只能通过前后文判断它属于什么情况下,还有空格的表示,虽然不会有语法错误,但都降低了表达式的可读性
      2. 转义字符是反斜杠,它其实有二元的作用,普通字符加反斜杠会成元字符,本身就是元字符的特殊字符加反斜杠表示它本身(表示为普通字符身份)
      3. 这里提三个关于字符的概念:元字符/普通字符/特殊字符
        1. 所有字符分为普通字符(所有大小写英文字母)、特殊字符(符号类的)、数字 和 其他字符(中文/日文什么鬼的根本不管的字符)
        2. 而元字符是从普通字符和特殊字符中挑选出来的字符,特殊字符成为元字符形式上不会有变化,普通字符成为元字符形式上需要加一个反斜杠
      4. 所有元字符统计
        1. (、)、|、. 、*、+、?、^、$、\、{、}、/、
        2. 不是元字符的统计
          1. 短横线、减号、<、>、
    2. 反义字符
      1. 这是一整套东西,一整套简单的东西,而且在命令上有规律
      2. 用它的目的是想查找除了数字以外,其它任意字符都行的情况
      3. 默认命令的话就是小写改大写,非默认命令是加^,如下
        1. \W -匹配任意不是字母,数字,下划线,汉字的字符
        2. \S -匹配任意不是空白符的字符
        3. \D -匹配任意非数字的字符
        4. \B -匹配不是单词开头或结束的位置
        5. [^x] -匹配除了x以外的任意字符
        6. [^aeiou] -匹配除了aeiou这几个字母以外的任意字符
    3. 分组
      1. 正则里是使用小括号进行分组的,这里的分组有两个作用

        1. 第一个跟其他地方使用小括号分组是一样的,都是表示运算的优先级,可以把括号内的内容当成一个优先级更高的整体
        2. 第二个是 后向引用
          1. 默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2
          2. 而后边的表达式中可以通过组号引用前面的组内容,比如\1 代表分组1匹配的文本
          3. 也可以自己指定子表达式的组名:(?<Word>\w+)(或者把尖括号换成‘也行:(?‘Word‘\w+)),这样就把\w+的组名指定为Word了,引用这个分组捕获的内容:\k<Word>
          4. 另外(?:exp)匹配exp,不捕获匹配的文本,只是为了不给此分组分配组号
    4. 分支条件
      1. 正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配
      2. 具体方法是用|把不同的规则分隔开
      3. 分支符号运算顺序最低,但是可以使用小括号来灵活调整范围
    5. 注释
      1. 通过语法(?#comment)来包含注释

参考文献:

http://deerchao.net/tutorials/regex/regex.htm

时间: 2024-10-18 12:34:56

正则表达式五分钟快速复习的相关文章

五分钟快速入门

本教程使用XML.注意,这个库不是专门绑定到XML的,而是可以使用任何其他支持的格式(如INI或JSON).之所以选择XML,是因为作者认为很多人都熟悉XML. 假设我们正在为某个应用程序编写一个日志系统,并且需要在程序启动时从文件中读取日志配置.带有日志配置的文件如下所示: <debug> <filename>debug.log</filename> <modules> <module>Finance</module> <mo

【转】正则表达式30分钟入门教程

首页 | 常用正则表达式 | 正则表达式测试工具 正则表达式30分钟入门教程 版本:v2.33 (2013-1-10) 作者:deerchao 转载请注明来源 目录 跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 网上的资源及本文参考文献 更新纪录 本文目标 30分钟内让你明白正则表达式是什么,

Git五分钟教程

许多人认为Git太混乱或是复杂的版本控制系统,这篇文章是面向一些人想快速上手使用Git, 对于大多数基本需求这篇文章涵盖了使用的70%至90% 入门 使用Git前 需要先建立一个仓库(repository).你可以使用一个已经存在的目录作为Git仓库或创建一个空目录 使用您当前目录作为Git仓库,我们只需使它初始化 git init 使用我们指定目录作为Git仓库 git init newrepo 从现在开始,我们将假设你在Git仓库根目录下,除非另有说明 添加新文件 我们有一个仓库,但什么也没

正则表达式30分钟入门教程 都是复制的

正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提出. 一些要说的话: 如果你没有正则表达式的基础,请跟着教程“一步步来”.请不要大概地扫两眼就说看不懂——以这种态度我写成什么样你也看不懂.当我告诉你这是“30分钟入门教程”时,请不要试图在30秒内入门. 事实是,我身边有个才接触电脑,对操作都不是

《sed的流艺术之三》-linux命令五分钟系列之二十三

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 上文接:<sed的流艺术之二>-linux命令五分钟系列之二十二 例五 给某些字符串后面插入些内容 [[email protected] programming]$ cat mysed.txt Beijing London[[email protected] programm

《sed的流艺术之二》-linux命令五分钟系列之二十二

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 上文接:<sed的流艺术之一>-linux命令五分钟系列之二十一 5 sed中有选项么?有没有什么比较常用的? sed最主要的就是command部分,把这部分玩转了,你就已经很厉害了,而玩转这部分的前提是玩转正则表达式.尽管如此,sed的选项部分的-n选项仍然是非常重要,理解

《sed的流艺术之一》-linux命令五分钟系列之二十一

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 1 你想过sed为什么叫sed么? sed是stream editor的缩写,sed就是一个流编辑器,说白了,就是我们往sed里输入一串信息,它给我们处理,然后输出来.就这么简单. sed和cut类似,是一个面向行处理的工具,它以“行”为处理单位,处理后的结果会输出到标准输出.所以说其实

正则表达式30分钟入门教程(转)

来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提出. 一些要说的话: 如果你没有正则表达式的基础,请跟着教程“一步步来”.请不要大概地扫两眼就说看不懂——以这种态度我写成什么样你也看不懂.当我告诉你这是“30分钟入门教程”时,请不要试图在30秒内入门. 事实是,我身边有个才接触电脑,对操作都不是很熟练的人通过自己学习这篇教

js正则表达式30分钟入门教程

2011-10-27 13:23:15 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你 想像中的那么困难.当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看 完这篇教程后,能把提到过的语法记住80以上的可能性为零.这里只是让你明白基本的原理,以后你还需要多练习,