zoukankan      html  css  js  c++  java
  • 架构思维案例:速学正则

     

    前言

    本文的目的不仅是教会读者怎么使用正则表达式。更希望通过学习正则表达式的案例,让读者感受一种不同的思维方式。鱼亦渔亦水,谁知道呢,我在扯淡,你要不要看?

    正文

    正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。--Ken Thompson

    这句话中提到了两点:

    1. 正则表达式是描述一组字符串特征的模式;
    2. 正则表达式是用来匹配特定的字符串的。

    匹配特定字符串就是正则表达式要解决的问题域。
    怎么解决的呢?通过描述一组字符串特征的方式来匹配。

    举个例子:

    www.ly.com

    我们通常是这样去描述的:3w.ly.com
    这里我们把连续的多个w,用位数简述了(对应位区间的概念,后面会详细讲解)。这就是正则表达式解决问题的思路。

    正则表达式:

    w{3}.ly.com

    再比如,怎么描述一个正整数呢?
    首位是1-9的数字,其余位为0到9。其余位位数是0到无穷。
    这里我们把首位字符的可能性罗列了出来。把其余位位数用一个可能性区间描述。

    正则表达式:

    [1-9][0-9]{0,}

    至此,我们感性认识了正则表达式。下面将正式带领大家认识这个“描述字符串特征的模式”。

    什么是字符串呢?一串字符呗。本着化繁为简的常规架构手法(分而治之),可以想到描述一组字符串特征的问题,可以拆解为:

    1. 描述一个字符特征的问题;
    2. 描述一个字符位区间的问题。

    比如,上面正整数的例子[1-9]描述了字符特征,{0,}描述了0到无穷的一个位区间。

    这里我们需要声明或重申几个概念:

    • 正则表达式:描述一组字符串特征的模式
    • 值特征:描述一个字符特征(可能性)的模式
    • 位区间:描述一个字符位区间的模式

    一、值特征符

    我们使用[ ]表示。如下:
    [Aa]:描述一个字符可能是A或a中的一个。

    1. 简写法
      • A=[A]
        当描述的字符取值只有一种可能时,我们通常用字面量A代替。

      • [1-5]=[1,2,3,4,5]
        当描述的字符取值的可能性是连续时,我们通常用-简写。

    1. 逻辑符号

      • |
        逻辑“或”

      • ^
        逻辑“取反”

    2. 抽象

      • 数字
      d=[0123456789]
      • 字母或数字或下划线
      w=[A-Za-z0-9_]
      • 空白字符
      s=[ f
      
      	v]
      • 大写字母是小写字符表征值的取反
      D=^d
      W=^w
      S=^s
      • 任意字符
      .

      正则中的object

    二、位区间符

    我们使用{}标识。如下:

    {3,5}:描述35位。
    {2,}:描述2到无穷位。
    {0,3}:描述03位。

    简写

    • {3}={3,3}
    • *={0,}
    • +={1,}
    • ?={0,1}

    三、边界符

    边界符不描述字符,而是描述字符串中的位置。

    • 行首:^
    • 行尾:$
    • 单词边界:

    四、分组符

    分组符是解决另一个问题。在我们选择出某个字符串后,我们在替换结果里使用其中的一部分(子模式)。
    我们把这种,先选择后使用的过程叫做后引用。
    其中分组符,就是用来解决子模式切割的。

    • 捕获分组:()
    • 非捕获分组:(?:)

    替换时,$0:是匹配的整个字符串。
    $1:是捕获的第一个子模式(从前到后遇到的第一个捕获分组起始符)
    依次类推,$n:是捕获的第n个子模式。

    下面给三个例子:
    例1:

    例2:

    例3:

    五、转义符

    怎么描述被正则表达式占用的关键字符呢?
    转义。

    例如:.描述.

     

     


     关注公众号“架构思维修炼”,输入关键字“正则表达式图解”,获取高清脑图。


     

  • 相关阅读:
    《大道至简》第一章读后感,java伪代码形式
    chm文件内容无法显示的问题
    Windows下.py文件右键菜单的增删
    在ArchLinux中安装VMWare Workstation
    笔记本屏幕锁定
    pacman 日志摘要
    数据库事务特性和隔离级别
    数据库范式以及ER图
    《剑指offer》算法题第四天
    《剑指offer》算法题第二天
  • 原文地址:https://www.cnblogs.com/hanzhaoxin/p/9107605.html
Copyright © 2011-2022 走看看