正则表达式入门

什么是正则?

正则是用于匹配字符串的字符组合的模式。正则不是一门编程语言,而是编程语言中会用到的一个工具,不管什么编程语言,都会用到正则表达式。
举个栗子:
想在以下文字中匹配以keai结尾的文字

clipboard.png

".+"表示"某" ".+keai" 成功匹配

clipboard.png

再举个栗子:
想在以下文字中匹配以chi开头的文字

"chi.+" 成功匹配

clipboard.png

为什么用正则?

除了正则,可以在程序中写一个解析器代替正则的工作。但是有了正则,一行代码就可以搞定~

正则核心语法

一个很好用的在线解析正则的网站
https://regexr.com/

最简单的情况:直接用文字匹配

clipboard.png

以下情况无法匹配 因为圆葱aa是一个整体 在下面的字符串找不到匹配字符

clipboard.png

当想要匹配圆某时 可以使用"圆."来匹配

clipboard.png

不难判断出
1. "."的含义:匹配除断行外任意一个字符
如图 匹配了所有字符

栗子1:
clipboard.png

栗子2:

clipboard.png

注意:断行不可匹配!!!!如下图

clipboard.png

一个特殊情况 当我们想要匹配3.14时 图中匹配的结果却是3.14和3-14

clipboard.png

这是因为"."代表任意字符
那么如何才能明确匹配到3.14呢?这就需要转义符"\"
"\."代表"." 如图 即可明确匹配到3.14

clipboard.png

2."w" 匹配阿拉伯数字,英文大小写字母和下划线(类似于用户名的格式)

clipboard.png

3."W" 匹配被"w"排除在外的字符("w"的补集)

clipboard.png

4."d" 匹配阿拉伯数字

clipboard.png

注意:"\d\.\d"匹配小数

clipboard.png

5."\D" 匹配非阿拉伯数字 包括空格("\d"的补集)

clipboard.png

6."\s" 匹配空白字符:空格 制表符 断行等

clipboard.png

7."\S" 匹配被"\s"排除在外的字符("\s"的补集)

clipboard.png

8."[]"字符集合方括号中填写出现的可能性(范围) 整个括号算一个字符

举个栗子:

clipboard.png

"-"在"[ ]"表示表示从一个字符到另一个字符
举个栗子就懂~

匹配a到z

clipboard.png

匹配0到9

clipboard.png

9.当需要匹配中文时 使用Unicode
Unicode是万国码,是用数字代表文字的一项标准。世界上所有可以书写,发音的语言都被Unicode所吸纳。
中文字符从0x4e00(19968)开始 0x9fa5(40869)结束
也就是说 记录在Unicode中的中文字符有20901个字~

可以查询Unicode的网站
http://graphemica.com/

clipboard.png

10."[范围]+"重复一次或多次

clipboard.png

注意特殊情况 (应用到前面所说 方括号代表范围)

clipboard.png

11."[范围]*"重复零次或多次

clipboard.png

12."[范围]?"重复零次或一次

clipboard.png

13."{a,b}"指定重复范围(a到b次)

clipboard.png

clipboard.png

"b" word boundary 单词边界

clipboard.png

想精确匹配一段字符 必须重复几次 也可在花括号中指定

clipboard.png

clipboard.png

想指定某字符至少重复几次 也可在花括号中指定

至少重复两次

clipboard.png

{0,}相当于"+" {0,1}相当于"?" {1,}相当于"*"

14.分组匹配
直接举个栗子来说
我们希望 替换句子中两个姓名的位置。如何实现? 这就要用到分组匹配。

clipboard.png

首先 使用圆括号将两个人名摘出来(也就是分组)

clipboard.png

使用https://regexr.com/网站中的替...

clipboard.png

"$1"代表第一组(李栓蛋) "$2"代表第二组(王花花)

clipboard.png

这样看来 想替换两名字的位置就简单极了

clipboard.png

so easy

一次性将两个句子都替换了

clipboard.png

这就是分组的强大之处:可以将我们指定的组暂时缓存,用序号表示,也可以命名(JS暂时不支持命名)

15.分组匹配但不捕获
首先看几组电话号码

clipboard.png

前4个为移动号码 第5个为联通号码 最后一个为电信号码
首先我们想要选中所有的移动号码 然后拿到它们的后四位

首先我们在乎的是前三位(一个号段) 然后是中间四位(我们并不在乎它们是什么) 最后是我们想要获取的四位(由于是我们最后想要获取的 所以我们用括号括起来 说明它是一个组)

clipboard.png

然后通过看号段 将其它号码排除在外 也就是说 我们只匹配137138182183这四种号段的电话号码 可以使用以下写法

clipboard.png

现在我们既匹配了所有移动号码 又获取到了他们的后四位

clipboard.png

此时我们只用到了第2组,也就是说我们的第一组是浪费的。我们只是想用这种方式匹配它而并不想要获取。有没有这种操作呢?当然有。
(?:模式)匹配分组但不捕获

clipboard.png

这样一来就不浪费了~

16.正向预查
首先看这坨字符

clipboard.png

前面是货币值,后面是货币单位。
现在我们的任务是,选中所有以元结尾的数字(不包括单位)

当我们需要匹配单位时

clipboard.png

但我们现在的任务是 只获取数字 不包括单位 此时就需要用到正向预查
(?=模式) 正向肯定预查

clipboard.png

它的含义就是 前面是我们要匹配的东西 后面一定是等号后面的东西 但是不匹配它

(?!模式) 正向否定预查
这句的意思是 匹配所有的数字 后面不是元的

clipboard.png

我们希望匹配100刀和100磅 但是匹配结果和我们预想不同

这就需要我们注意 当使用反向预查时 我们后面要将前面匹配的类型排除在外。

clipboard.png

这就成功匹配了。

17.反向预查
上面我们提到正向预查 正向预查是 我们要匹配的东西的右边一定是什么
而反向预查是 我们要匹配的东西的左边一定是什么

我们的任务是 匹配所有人民币的数额

clipboard.png

(?<=模式) 反向肯定预查

clipboard.png

注意:JS引擎不支持反向预查 右上角切换一个更加完善的引擎即可~

与之相反的是反向否定预查

(?

clipboard.png

我们发现 跟之前出现了同样的问题

同理前面所说 应用反向预查时要将后面匹配的类型排除在外

clipboard.png

这样就可以匹配到非人民币的货币数额~非常强大!

你可能感兴趣的:(正则表达式入门)