正则在很多编程语言中都有,它们的用法基本都是类似的,不同的语言可能会存在一些区别。在JavaScript中,正则也有它自己的特点,正则表达式对很多前端开发人员,尤其是前端小白或者没有任何系统编程经验的程序员来说,往往都是一个难以理解和使用的技术点,学习和掌握正则,是迈向前端中高级的一个必须掌握的技能,学习和掌握正则表达式的使用,可以高效解决前端开发中遇到的很多棘手的问题。
下面开始今天的正题:
JavaScript通过内置对象RegExp支持正则表达式
有两种方法实例化RegExp对象
1.字面量
var reg = /is/;
2.构造函数
var reg = new RegExp('/is/','gim');
//gim为修饰符,g:global全文搜索,不添加,搜索到第一个匹配停止;i:ignoreCase忽略大小写,默认大小写敏感;m:multiple lines多行搜索。
正则表达式有两种基本字符类型组成:
——原义文本字符(像字母a,数字9等等简而言之它是什么就是什么)
——元字符(元字符是在正则表达式中有特殊含义的非字母字符,如\d表示数字)
在正则表达式中有几个字符是需要特别注意的:
. * + ? $ ^ | \ () {} []
元字符(下图来源于w3c截图):
字符类:
一般情况下,正则表达式一个字符对应字符串一个字符(这点很重要)。我们可以使用元字符[ ]来构建一个简单的类。所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符,表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符串。
例如:
"a1b2c3d4".replace(/[abc]/g,"x");
替换结果为:
x1x2x3d4
范围类:
正则表达式还提供了范围类,我们可以使用[a-z]来连接两个字符表示从a到z的任意字符,这是个闭区间,也就是包含a和z本身。注意其中的“-”,在范围之间的表示范围,不在范围之间的表示字符本身。
例如:
"a1b2c3d4".replace(/[a-z]/g,"x");
替换结果为:
x1x2x3x4
预定义类:
边界:
正则表达式还提供了几个常用的边界匹配字符
需要特别注意的是^,在范围类[ ]里面表示取反。
量词:
假如我们想要匹配一串数字:
“1234567890”
正则这么写:
/\d\d\d\d\d\d\d\d\d\d/
太繁琐了,有些特殊场景下根本不适用,那该如何简写呢?这就用到接下来要说的量词。
则,上面的例子要匹配包含10个数字的序列的字符串的写法为:
/\d{10}/
贪婪模式:
例如:
一串数字123456789
正则\d{2,4}匹配的话会选择到:
1234而不是12,或者123(没有用全局搜索,则从最开始查找),正则会选择长度最大的查找结果作为结果返回。
非贪婪模式:
让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,就是非贪婪模式。具体做法很简单,就是在量词后面加上?即可。
"123456789".match(/\d{3,5}?/g);
结果为["123","456","789"]
分组:
如何匹配一个字符串3次?
正则写法你可能想这么写:
good{3}
实际上是不对的,它只会匹配到:
gooddd
那么如何正确的写呢?
用()分组即可.
(good){3}
反向引用:
如何将 “2019-07-31” 用正则匹配修改格式为 "07/31/2019" ?
var reg = /(\d{4})-(\d{2})-(\d{2})/g
“2019-07-31”.replace(reg,“$2/$3/$1”)
$加索引跟()分组一一对应。
不希望捕获某些分组,只需要在分组内加上?:就可以
(?:good).(ok)
$1即为ok,而不是good。
前瞻:
正则表达式从文本头部向尾部开始解析,文本尾部方向成为“前”。
前瞻就是正则表达式匹配到规则的时候,向前检查是否符合断言,前瞻通俗来讲就是当表达式匹配到字符以后,根据定义的前瞻规则比如规定它后面一个挨着的字符是不是数字,如果是就符合匹配,否则不符合,可以认为前瞻相当于两套匹配规则,即当第一套匹配上以后再判断匹配到的条件是否符合第二套规则,均符合则取。后顾/后瞻方向相反,JavaScript不支持后顾。符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配。
例如:\w(?=\d),表示匹配后面一个紧挨着数字的字符
对象属性:
正则表达式的方法:
RegExp.prototype.test(str);检索字符串中指定的值。返回 true 或 false。
RegExp.prototype.exec(str);检索字符串中指定的值。返回找到的值,并确定其位置。
RegExp.prototype.compile();编译正则表达式。
支持正则表达式的String对象的方法:
方法很常见,不懂的可以自行百度。
纯手码字,部分地方为了省事直接截图,喜欢的小伙伴可以点波关注哦
网友评论