资讯专栏INFORMATION COLUMN

原来正则表达式这么简单

entner / 1839人阅读

摘要:开始一个完整的正则表达式通常由两部分组成普通的字符不普通的元字符。元字符匹配正则表达式中有着丰富的元字符提供,这里我们选择常用的进行具体讲解。

作为一个程序员,我们在日常的开发过程中需要对一些文本内容进行快速查找匹配以及内容替换等操作,而我们最常用的方法就是通过正则表达式来实现。什么是正则表达式呢?我们可以理解为是一种专门处理文字的工具,通过制定规则来匹配文字的位置或者内容,对结果进行操作。

开始

一个完整的正则表达式通常由两部分组成普通的字符、不普通的元字符。普通字符很好理解指的就是26个英文字母大小写a(A)~z(Z)和数字0~9,不普通的元字符从字面上可以看出点特殊,元字符其实就是指具备一些特殊含义的字符 例如 ".*?+^$"等,那么字符和元字符可以互转嘛?答案是可以的,神奇的元字符反斜杠""也可以实现这个功能,客官别不信,我们接着看~~

字符匹配

在正则表达式中我们可以通过普通的字母和数字组成最基本的匹配规则,对内容进行一一对应,例如 我们现在想在"hello,world!"中找到"hello",我们通过 /hello/ 正则表达式就可以了。

但单单只通过普通字符匹配往往是不能满足我们的需求的,例如 现在有一段内容"***分割线***",我们希望把内容中的""替换成"-",可""是元字符具有特殊含义,因此这个时候指通过普通字符是无法实现的,但通过转义字符就可以实现,后面我们会讲到。

元字符匹配

正则表达式中有着丰富的元字符提供,这里我们选择常用的进行具体讲解。

多字符匹配

在字符匹配章节我们举例从"hello,world!"中找到"hello",我们通过一一对应的方式筛选对应的字符,但在实际场景中我们经常会遇到一对多的情况,例如"hello,xx!","xx"对应的可能是"world"也可能是任意其他字符,这个时候我们通过单字符匹配的话显然很低效,如果能有一种模式涵盖表示这类字符岂不快哉,各位看官,现在我们推出第一个元字符,代表集合含义的[],集合顾名思义就是某一类的合,现在我们对正则进行改写即 /hello,[abc]/ ,这时候我们可以同时匹配a,b,c三个字符,但这种写法依然很低效,我们需要一个能表示区间的字符,区间元字符 - 正合适,这时候我们可以写成 /hello,[a-z]/ ,这时候我们就可以匹配所有26个小写英文字母了,即便如此,在某些场景下我们单单有集合和区间去匹配多个字符也是很低效的,所以正则表达式衍生出了很多可以匹配多个字符的简写方式:

正则表达式 含义
. 换行符之外的任意字符
d 数字 0~9 (即[0-9])
D 与d相反,表示 除了数字0~9的任意字符
w 26个大小写字母、数字、下划线(即[a-zA-Z0-9_])
W 与w相反,表示 除了基本字符下划线的任意字符
s 空字符,包括 制表符、换页符、换行符、空格
S 与s相反,表示 非空字符​
数量匹配

我们在进行对字符匹配的时候往往需要对匹配的字符数量进行限制,本章节就数量元字符进行讲解,从字面意义可以看出数量元字符肯定就是对匹配字符的个数进行限制啦,例如 同样是上面的"hello,world",我们需要找出"hello",一种方式通过单子符匹配方式即 /hello/ ,其实我们还可以对其进行简化,表示精确区间范围的 {min,max} or{num}元字符,"hello"中"l"出现了两次,那么我们就可以改写成 /hel{2}o/ ,当然这个例子比较简单,我们换个复杂一点的,现在我们需要从"OObama like bababanana ..."中找出"ba"连续出现2次以上的地方,从内容上可以看出"ba"出现的地方有两处,这个时候我们实际要找的是"bababa",所以我们可以写成 /ba{2,}/ ,除了 {} 外,正则表达式还有很多用来数量匹配的元字符:

正则表达式 含义
? 匹配0或1个字符(即0|1
* 匹配0或者多个字符(即0|n
+ 匹配1或者多个字符(即1|n
{min,max} or {num} 精确区间匹配,min表示最少,max表示最多个数,num表示精确个数
位置匹配

位置元字符主要是用来限制查找内容的范围,例如限制在内容的开头或者内容的结尾等,举个例子 "Hello,World!Hello, China"我们想查找开头的"Hello",但内容中"Hello"出现了两次,因此我们需要一个可以限制查找范围为内容开头的元字符, /^/ 表示匹配表达式的开头,所以我们改为/^Hello/,有客官举报说,大骗子,我通过 /Hello/ 也可以匹配到,好,我们换一个,现在改成"World is my World!",我需要匹配第二个"World",这...不慌不慌,我们通过 /$/ 限制查找范围是表达式的结尾就可以了,即 /World$/ ,除了限制范围是开头、结尾,我们还可以通过 // 来限制单词的边界,或者 /(?=xx)/ 来匹配某个(xx)前面的内容符合表达式的字符,通过 /?<=xx/ 来匹配某个后面的内容符合表达式的字符,举个例子现在有"People like apple",我想在所有ple的单词中找到符合ple前面为"ap"的那个ple,则可以写成/(?<=ap)ple/,总结正则表达式中对位置进行匹配的元字符有:

​正则表达式 含义
^ 匹配表达式的开头
$ 匹配表达式的结尾
b 匹配单词的边界
B 匹配非单词的边界
(?=xx) 向前匹配符合xx规则的副词
(?!xx) 向前匹配不符合xx规则的副词
(?<=xx) 向后匹配符合xx规则的副词
(? 向后匹配不符合xx规则的副词
模式匹配

通过正则表达式进行内容匹配的时候,我们会遇到对全文内容匹配、多行内容匹配等场景,正则表达式也提供了三种模式元字符进行模式匹配。g表示全局模式,即匹配所有的内容;i表示忽略大小写,即匹配内容的时候忽略字母的大小写;
m表示多行匹配模式,即对多行内容进行匹配,并且各种模式可以混合使用,例如"Hello World, hello China",我们需要匹配所有的"Hello"且不区分大小写,即/hello/ig

正则表达式 含义
g 匹配全局模式
i 匹配不区分字母大小写
m 匹配多行模式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109687.html

相关文章

  • 原生js练习题-第一课

    摘要:于是找来了前辈们留下的经典原生练习题,以期把看过的内容用起来,加深自己对原生的掌握。鼠标移入移出改变样式实现效果继续样式转换,虽然用的伪类便能实现,但既然是的练习题就得用用鼠标事件了。 0x0关于这个系列 差不多把《js高级程序设计》刷完了,所谓实践出真知,尤其编程这种实践和经验相当重要的事情,不能光说不做。但以我现在的水平,直接上手那些大项目是还是不够格的,还是得一步步扎实好基础再有...

    mdluo 评论0 收藏0
  • js正则达式学习笔记

    摘要:说来惭愧,做前端快三年对于正则表达式的应用还是很浅薄,大家都知道正则的速度基本上是最快的,但就是懒得去记那些语法和规则,这次项目中多次用到了需要匹配替换的动作,终于下定决心去研究一下了。 说来惭愧,做前端快三年对于正则表达式的应用还是很浅薄,大家都知道正则的速度基本上是最快的,但就是懒得去记那些语法和规则,这次项目中多次用到了需要匹配替换的动作,终于下定决心去研究一下了。 实例化正则对...

    Towers 评论0 收藏0
  • 深入浅出,手把手教你编写正则达式

    摘要:日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。主要可以干的事情有两个,引用和反向引用,在一些稍微复杂的正则表达式里,我们常常会用到这些。 日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。 基本语法 [xyz] ...

    bitkylin 评论0 收藏0
  • 深入浅出,手把手教你编写正则达式

    摘要:日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。主要可以干的事情有两个,引用和反向引用,在一些稍微复杂的正则表达式里,我们常常会用到这些。 日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。 基本语法 [xyz] ...

    andot 评论0 收藏0
  • 深入浅出,手把手教你编写正则达式

    摘要:日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。主要可以干的事情有两个,引用和反向引用,在一些稍微复杂的正则表达式里,我们常常会用到这些。 日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。 基本语法 [xyz] ...

    Jackwoo 评论0 收藏0

发表评论

0条评论

entner

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<