小白适用正则表达式 学习笔记

正则表达式

一、表达式入门

一、匹配特定数据

正则表达式可以匹配某些特定的数据,如果你想要从庞大的文字信息中提取出小段你需要的的数据,那么正则表达式或许能帮助到你。

例如:输入 code就可以匹配所有包含code的数据

二、字符串

如果只是使用正则表达式来匹配文本,没有什么意义,毕竟检测一个文本中是否有另外一个字符串本来就非常简单。正则表达式强大的地方在于它可以迅速的用简单的方式达到字符串的复杂控制。字符组[]允许匹配一组中可能出现的字符。

例如

可以发现[Pp]既可以匹配大写的P也可以匹配小写的p

三、区间

有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码每次我们都需要使用[0123456789]。这样是非常麻烦的的,如果这样我们需要任意小写和大写字母,你真的愿意从a写到z或者A写到Z。为了适应这一点,正则表达式引擎字符组中使用连字符(-)代表区间,依照这个原则,我们可以总结出三点:

  • 要匹配任意数字可以使用[0-9]

  • 要匹配任意小写字母可以使用[a-z]

  • 要匹配任意大写字母可以使用[A-Z]

例如

四、匹配特殊字符

当使用特殊符号匹配时,要使用()进行转义

例如

正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 -号,该怎么办呢?

这个时候我们需要对-号进行转义操作,即 \-

在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 \-,即 \- 就代表了 - 号本身。

五、匹配字母

使用正则表达式匹配字母,规则如下

  • 匹配[a-z]的小写字母

  • 匹配[A-Z]的大写字母

六、匹配目标数据

七、取反

可以通过在字符数组开头使用^字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。

例如

这里的 n[^e] 的意思就是n后面的字母不能为 e

二、快捷方式

一、快捷匹配数字和字母

正则表达式引擎提供了一些快捷方式如:\w可以与任意单词字符匹配。当我们要匹配任意数字的时候也可以使用快捷方式 \d,d即digit数字的意思,等价于[0-9]。

快捷方式描述
\w与任意单词字符匹配,任意单词字符表示[A-Z]、[a-z]、[0-9]、_
\d匹配任意数字字符

二、匹配空白

\s快捷方式可以匹配空白字符,比如空格、tab、换行等。

例如

三、单词边界

\b匹配的是单词的边界

例如

四、匹配数字和小写字母

五、快捷方式取反

快捷方式也可以取反,例如对于\w的取反为\W,将小写改写成大写即可,其他快捷方式也遵循这个规则。\d--\D \b--\B \s--\S

六、开始和结束

正则表达式中 ^ 指定的一个字符串的开始,$指定的是一个字符串的结束。

例如:

七、任意字符

(.)字符代表匹配任何单个字符,他只能出现在方括号以外。值得注意的是:. 字符只有一个不能匹配的字符,也就是换行符(\n),不过要让 . 字符与换行符匹配也是可以的,以后会讨论。

有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。这个时候我们可以使用 ?符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。

例如:

八、可选任意字符

三、匹配多个数据

一、重复

在一个字符组后加上{N}就是可以表达在他前面的字符组出现N次

例如:

二、重复区间

重复区间语法:{M,N},M是上界N是下界。

例如:

\d{3,4}既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为这则表达式默认是贪婪模式,即尽可能地匹配更多的字符,而要使用非贪婪模式,我们要在表达式后面加上 ? 号。

三、开闭区间

有时候我们可能遇到字符组的重复次数没有边界,

例如:

闭区间不写即可表示匹配一个或无数个。

速写:

可以使用 + 匹配一个到无数个,使用 * 代表零个到无数个。即: + 等价于{1,}, * 等价于{0,}。

例子:

四、匹配所有手机号码

五、匹配网络地址

总结:

 

四、分组

一、分组

在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。实现分组很简单,使用()即可。

例如:

这段正则表达式将文本分成两组,第一组为:0731,第二组为8825951。

分组有一个非常重要的功能——捕获数据。所以()被称为捕获分组,用来捕获数据,当我们想要匹配好的数据中提取关键数据的时候可以使用分组。

(\d{4})(\d{7})就分别捕获了两段数据:

  1. 0731

  2. 8825951

使用分组提取数据

二、提取p标签中的数据

三、提取学号

四、提取年月日

五、或者条件

使用分组的同时还可以使用 或者(o'r)条件,语法符号为 | 符号

例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号:

提取所有视频文件

视频文件的后缀为

.mp4、.avi、.wmv、.rmvb

六、非捕获分组

有时候,我们并不需要捕获某个分组内容,但是又想使用分组的特征。这时候就可以使用非捕获分组(?:表达式),从而不捕获数据,还能使用分组的功能。

例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:

七、分组使用技巧

现在我们想要使用正则表达式将其中的年月日全都提取出来。可以发现他们唯一的区别就在于分隔符和月份与日期,这个时候可以使用[]来匹配多种情况。

例如:

八、提取所有电话号码

九、分组的会说引用

分组的回溯引用语法:使用\N可以引用编号为N的分组。

例子:

十、回溯引用的实践

五、先行断言

一、正向先行断言

很多人也称先行断言和后行断言为环视,也有人叫与搜索,其实叫什么无所谓,重要的是知道如何使用他们!

先行断言和后行断言总共四种:

  1. 正向先行断言

  2. 反向先行断言、

  3. 正向后行断言

  4. 反向后行断言

正向先行断言:(?=表达式),在某个位置向右看,表示所在位置右侧必须能匹配表达式

例如:

我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你

如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你),这就是正向先行断言

提取包含的大小写字母的字符串

先行断言可以判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的字符串:

(?=.*?[a-z])(?=.*?[A-Z]).+这段正则表达式规定了匹配的字符串中必须包含至少一个大写和一个小写的字母。

二、反向先行断言

反向先行断言(?!表达式)的作用是保证右边不能出现某字符。

例如:

我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你如果要取出喜欢两个字,要求这个喜欢后面没有你,这时候就这么写:喜欢(?!你),这就是反向先行断言。

三、匹配标签

六、后行断言

一、正向后行断言

先行断言从左往右看,后行断言从右往左看。

正向后行断言:(?<=表达式),只在某个位置向左看,表示所在位置左侧必须能匹配表达式

例如:

如果要取出喜欢两个字,要求喜欢的前面有我后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)

二、反向后行断言

反向后行断言:(?<!表达式),指在某个位置向左看,表达所在位置左侧不能匹配表达式

例如:

如果要取出喜欢两个字,要求喜欢的前面没有我后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值