正则表达式学习笔记(二)
五种断言
断言指的是对模式的边界匹配,比如在头部开始,或者在尾部开始,又或者指定一个边界开始,基本分为五种断言方式,分别为边界断言,先行断言,先行否定断言,后行断言,后行否定断言。
边界断言
边界断言可以在指定边界进行匹配,常用的元字符为^
,$
,^
可以在头部进行匹配,$
可以在尾部进行匹配
"ba"
头部为b
,所以并没有被/^a/
匹配到,而"ba"
的尾部为a
所以可以被/a$/
匹配到。
先行断言
先行断言:/x(?=y)/
,在y
前面的区域对x
进行匹配
上面的例子使用先行断言/a(?=b)/
,只有在a
在b
前可以被匹配到
先行否定断言
先行否定断言:/x(?!y)/
只有不在y
前面的区域才能对x
进行匹配,可以用数学集合来解释,先行断言与先行否定断言的并集为全集。
上面的例子使用先行否定断言/a(?!b)/
,即只有不在b
前的区域内可以对a
匹配,而ca
没有这个区域。
后行断言
后行断言:/(?<=y)x/
,与先行断言方向相反,即在y
后的区域对x
进行匹配
上面例子使用后行断言/(?<=b)a/
,只有在b
后的区域内可以对a
匹配
后行否定断言
后行否定断言:/(?<!y)x/
,只有不在y
后面的区域才能对x
进行匹配,与后行断言的并集为全集
三种方式
正则表达式有三种创建方式,分别为字面量创建,构造函数+字面量创建,构造函数+字符串创建
字面量创建
构造函数+字面量创建
通过RegExp
构造函数创建正则,本质上正则表达式是一个对象实例,参数是字面量形式。
构造函数+字符串创建
通过RegExp
构造函数创建正则,参数是字符串形式。
不同之处
会有人想这三种方法就直接使用字面量创建不是最简单的形式么,其实字面量创建和构造函数创建在编译时机有着很大的区别
字面量创建的正则会在脚本运行后进行编译
构造函数创建的正则会在脚本运行时进行编译
编译时机上的区别让两种形式的使用场景发生了变化
脚本运行后编译适用于正则保持不变的情况,这样会使性能更加稳定
脚本运行时编译适用于正则需要随着用户的交互发生变化,这样就需要构造函数来创建和脚本实时编译。
多种匹配
简单匹配
简单匹配即想要匹配特定的字符,比如我想要在一串字符串内寻找某个特定的词,可以使用简单模式进行直接匹配,这也是其特点,简单模式直接且严格。
组匹配
组匹配可以搭配()
与-
元字符使用,可以匹配多组数据,常用来切割时间戳等场景
还可以使用具名组匹配可以为匹配结果指定一个名字
具名组匹配的结果会被添加到groups
属性中,那么我们还可以通过解构赋值来拿到结果
范围匹配
使用[]
与=
元字符进行范围匹配
如上匹配0-9
区间内的数字,还可以通过范围匹配来匹配所有的汉字,字母等等
多次匹配
使用+
,{x,y}
,*
元字符来特定匹配某规则 n 次
使用+可以匹配多次
使用{x,y}
可以指定次数范围
其中x
和y
表示一个范围,可以为{x}
,{x,}
与{x,y}
分别代表x
次,x
到无穷次与x
到y
次,而*
等价于`{0,}
版权声明: 本文为 InfoQ 作者【lxmoe】的原创文章。
原文链接:【http://xie.infoq.cn/article/1bb5673751d07eca87abf53ab】。文章转载请联系作者。
评论