js正则表达式学习笔记

说来惭愧,作前端快三年对于正则表达式的应用仍是很浅薄,你们都知道正则的速度基本上是最快的,但就是懒得去记那些语法和规则,此次项目中屡次用到了须要匹配替换的动做,终于下定决心去研究一下了。前端

实例化正则对象

  • 对象字面量正则表达式

/pattern/attributes函数

正则对象由这两部分构成pattern(匹配规则)+attributes(修饰符)学习

var reg = /\bis\b/

这样就成功的实例化一个正则表达式对象,接着咱们去应用它spa

clipboard.png

字符串的replace函数接受两个参数,第一个参数能够是字符串或者正则表达式,第二个参数是须要替换的字符串,这样咱们就成功把小写的’is‘替换成了大写的’IS‘
好多同窗看那一串符号又开始头晕了,别急,听我慢慢道来prototype

咱们先来拆解这个正则表达式
首先开头结尾的//是必须的,而后是两个’b‘,表明着单词的开头或结尾,也就是单词的分界处,最后中间的is是须要匹配的字符串。连起来意思就是匹配字符串中的is,而且先后必需要有分界,也就是说’isisisisis‘这里的is不能替换成’ISISISISIS‘
好了,有同窗会问,为何句子中的第二个’is‘没有被替换,为何咱们没看到所谓的那个修饰符。咱们再改写一下这个正则对象3d

clipboard.png

发现多了一个修饰符g,表明全局(globle)搜索,这样就能够匹配字符串中的全部的’is‘code

  • 构造函数对象

var reg = new RegExp(pattern,attributes)blog

var reg = new RegExp('\\bis\\b','g') === var reg = /\bis\b/g

这里须要解释下为何一样的匹配规则却多了两个\
那是由于在js语法中,\须要转义,因此在这里的构造函数参数中须要把\转义

clipboard.png

修饰符

  • g--globe

这个在以前的例子中你们已经见识过了,就是全局搜索,默认匹配到第一个就会中止

  • i--ignore case

忽略大小写,默认大小写敏感

clipboard.png

  • m--multiple lines

多行搜索

各类规则

  • 元字符

正则表达式有两种基本字符类型组成--原义文本字符和元字符
原义文本字符:字母数字这种无需转义的字符
元字符:在正则表达式中有特殊含义的非字母字符

* + ? $ ^ . | \ () {} []
  • 字符类

咱们能够用元字符[]来构造简单的类
好比说:[abc]就把abc三个字母归为了一类,表达式能够匹配这一类字符

clipboard.png

  • 字符类取反

使用元字符^表示不属于建立的类中的字符

clipboard.png

  • 范围类

若是要是利用字符类匹配26个英文字母难道要一一写出来么,哈哈哈,too young too simple
使用范围类[a-z]匹配全部的26个英文字母,相加匹配条件就直接加在[]里面。
好比说[a-zA-Z0-9]匹配大小写的英文字母和0-9的数字

clipboard.png

  • 预约义类

clipboard.png

看一个例子:匹配ab+数字+任意字符的字符串

在学习预约义类以前咱们的写法是

ab[0-9][^/n/r]

如今咱们学习了预约义类以后就能够这样

ab\d.
  • 边界

clipboard.png

这里的单词边界在最先的例子中咱们已经见识过了,如今咱们对比一下b和B的区别

clipboard.png

^和$的用法

clipboard.png

须要注意的是^和$在正则中的位置

  • 量词

若是咱们须要匹配连续出现100次数字的字符串难道要写100个\b
伟大的js语言固然不会这么傻了,这不引入了量词的概念么

clipboard.png

这一次的例子咱们结合接下来的概念一块儿理解

贪婪模式与非贪婪模式

clipboard.png

这个例子中咱们把0-9这九个数字先是用{3,6}来全局匹配,发现匹配出两个NB
我来解释一下,正则表达式默认是贪婪模式匹配,即在量词范围中取最大的那个来匹配,因此第一个才会出现两个NB,1-6匹配一个NB,7-9匹配一个NB。而第二个匹配范围是{3,7},结果是NB89,由于最大值是7,因此1-7匹配成NB,而剩下的8,9达不到3个,因此没有匹配成功

clipboard.png

这个非贪婪模式和贪婪模式相反,即取最小值来匹配,用法是在量词后面加?。
正确设置匹配模式对于处理复杂的正则是颇有益处的

分组

如今有这样的需求,匹配wensnb这个字符串出现三次,是否是有的同窗会说

wensnb{3}

这样固然是错啦,由于只会匹配b出现三次,这时候就须要分组的概念

()能够起到分组的效果

clipboard.png

用 | 表示或,下面的例子展现或在分组中的应用

clipboard.png

()把nb和123分组,而且用|表示二者取其一

  • 反向引用

利用$进行分组中的引用,分别把分组中的内容对应$1....$n

clipboard.png

  • 忽略引用

并非全部的分组咱们都但愿引用,用?:来忽略引用

clipboard.png

咱们把上个例子中的第二个引用忽略,因此引用个数由3变成2个,所以找不到$3
原来对应$3的24如今变成了$2,而$1不变

前瞻

你们听这个名字前瞻就知道必定有一个后顾和他对应,说的没错,只不过在js语法中的正则不支持后顾,因此咱们只关注前瞻就够了

咱们先来定义“前”:

在正则表达式中匹配是由文本头部到尾部(左到右),因此这个“前”表明的是文本的尾部

下面来定义前瞻:

正则表达式匹配到规则时再向前检查是否符合断言或者不符合断言(也是正则)

clipboard.png

正向和负向前瞻的区别就是匹配到正则以后是否符合断言,符合断言称为正向前瞻,不符合就是负向前瞻

下面来看一个例子

clipboard.png

在这个正向前瞻中,匹配一个单词字符(w不只表明单词,还表明数字下划线)而且前面的还要符合数字1-3这个断言才行,所以咱们把w e n这三个字符匹配到了

正则表达式的属性和方法

  1. 属性

    clipboard.png

在文章的开始咱们介绍了修饰符globle,ignoreCase,multilines
其实这个都是正则表达式的属性,而且有两个咱们没有说lastIndex和source
这五个属性都是只读,不能修改

clipboard.png

clipboard.png

  1. 方法

RegExp.prototype.test(str) //匹配传入的字符串符不符合正则规则(true or false)

clipboard.png

RegExp.prototype.exec(str)

相关文章
相关标签/搜索