博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
架构思维案例:速学正则
阅读量:4542 次
发布时间:2019-06-08

本文共 1458 字,大约阅读时间需要 4 分钟。

 

前言

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

正文

正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。--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\n\r\t\v]
    • 大写字母是小写字符表征值的取反
    \D=^\d\W=^\w\S=^\s
    • 任意字符
    .

    正则中的object

二、位区间符

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

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

简写

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

三、边界符

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

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

四、分组符

分组符是解决另一个问题。在我们选择出某个字符串后,我们在替换结果里使用其中的一部分(子模式)。

我们把这种,先选择后使用的过程叫做后引用。
其中分组符,就是用来解决子模式切割的。

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

替换时,$0:是匹配的整个字符串。

$1:是捕获的第一个子模式(从前到后遇到的第一个捕获分组起始符)
依次类推,$n:是捕获的第n个子模式。

下面给三个例子:

例1:

例2:

例3:

五、转义符

\

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

转义。

例如:\.描述.

 

 

 


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


 

转载于:https://www.cnblogs.com/hanzhaoxin/p/9107605.html

你可能感兴趣的文章
css初始化样例代码
查看>>
内边距、边框和外边距的关系
查看>>
模板语言--变量
查看>>
div下面多个a标签的点击事件,并且获取a的属性
查看>>
php 计算 距离
查看>>
.hivehistory
查看>>
面试总结
查看>>
洛谷 P2814 家谱(gen)
查看>>
Android教程之MediaStore
查看>>
StarUML官网地址 http://staruml.io/
查看>>
死锁现象
查看>>
jquery点击按钮后倒计时并无法提交,倒计时结束后恢复
查看>>
mysql里面如何用sql语句让字符串转换为数字
查看>>
Xamarin.iOS中使用MvvmLight框架
查看>>
BZOJ1565: [NOI2009]植物大战僵尸
查看>>
git pull ,git fetch ,git merge
查看>>
LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)
查看>>
[No0000EB]C# 数组(Array)
查看>>
[No0000F0]DataGrid一行Row添加ToolTip,wpf
查看>>
这本书能让你睡得好
查看>>