正则表达式

分组和引用

使用小括号()将字符作为一个最小单元,同时小括号还能记忆这个组合相匹配的字符串,再使用反斜杠引用前面分组的表达式,数字1表示第一个小括号。这时就可以实现前面组合的重复;

小括号组成分组,分组可以嵌套;

引用是以分组为前提的,应用的就是分组,分组可以嵌套,分组的顺序取决于分组符号的左侧部分的顺序。

(?:pattern)匹配pattern但不获取匹配结果,也就是这是一个非获取匹配

(pattern),匹配pattern同时获取匹配结果,这是一个获取匹配,可以供后面使用

正向肯定(否定)预查 反向肯定(否定)预查

正向肯定预查 (?=pattern) 在任何匹配pattern的地方开始匹配查找字符串,例如我想匹配Windows后面加数字,但是我只要Windows

var pattern=/Windows (?=\d+)/ 可以匹配Windows 2000中的Windows,(匹配字符串Windows 2000,但是只获取pattern之前的字符串Windows,不获取pattern2000 )不能匹配Windows XP中的Windows

正向否定预查(?!pattern),在任何不匹配pattern字符串开始处匹配查找字符串

var pattern=/Windows (?!\d+)/ 可以匹配Windows XP中的Windows 不能匹配Windows 2000中的Windows(匹配字符串Windows XP,但是只保留!pattern之前的Windows,不获取!pattern XP)

反向肯定预查(?<=pattern) 与正向肯定预查类似,只是方向相反 ,从匹配pattern之前查找字符串

var pattern=/(?<=\d+) Windows/ 可以匹配2000 Windows中的Windows 不能匹配this is Windows中的Windows (2000 Windows,获取匹配pattern之后的字符串Windows,不保留pattern 2000)

反向否定预查(?<!pattern) 与正向否定预查类似,只是方向相反 ,从不匹配pattern之前查找字符串

var pattern=/(?<!\d+) Windows/ 可以匹配this is Windows中的Windows 不能匹配2000 Windows 中的Windows (this is Windows,获取匹配!pattern之后的字符串Windows,不保留!pattern this is)

 

 创建正则表达式:

1 var reg=new RegExp('\d{2,3}','ig');

2 var reg=/\d{2,3}/ig;

正则对象的方法:

1 test  判断是否匹配pattern,返回true false

2 exec 检测是否有匹配的值,有则返回一个数组,否则返回null

字符串的方法:

1 match 找到匹配的值,有返回一个数组,没有返回null

let reg = /s/ig; console.log("studys".match(reg)); ///[ 's', 's' ]

2 search 匹配是否有匹配值,返回第一个符合的子字符串的起始位置,没有返回-1

let reg = /s/ig; console.log("studys".search(reg)); ///打印0,有两个s,只打印了第一个位置的s

3 replace 替换正则表达式的值

let reg = /s/ig; console.log("studys".replace(reg,"***")); /// 返回***tudy***

 

demo:没有分组

 

 

 

4 split 把字符串按pattern分割成数组

let reg = /s/ig; console.log("goodstudysboy".split(reg)); ///[ 'good', 'tudy', 'boy' ]

 正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”

 前瞻,就是在正则表达式匹配到规则的时候,向前检测是否符合断言,后顾/后瞻 方法相反

前瞻reg(?=assert) 匹配reg之后还要查看是否符合断言assert,如果符合就成功,但是只取匹配的部分,断言只是判断不包含在匹配结果中

正则表达式属性:

source 正则表达式的文本字符串

global 是否是全文搜索,默认false,只读

ignoreCase:是否大小写敏感,默认false,只读

multiline:多行搜索,默认值是false,只读

lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置(全局搜索的时候正则表达式对象,每次执行的

结果不一样就是lastIndex的影响),所以判断是否符合时test方法不要加\g,如果需要知道具体的信息可以是用exec方法)

js中正则表达式的使用方式有两种,一种是正则表达式对象的方法,一种是字符串对象的方法,前者有exec(str)、test(str)两个方法,后者有match(regexp)、replace(regexp)、search(regexp)、split(search)四个方法。当作为正则表达式对象的方法使用时,要特别注意它的lastIndex属性。

var regexp = /abcd/g;
var str = 'abcdefg';
alert(regexp.test(str));  //true
alert(regexp.test(str));  //false
alert(regexp.test(str));  //true

上面这段代码运行的结果分别是弹出true、false、true,考虑到用的是同一个正则模式,是不是让人有点迷糊?

其实这正是正则表达式对象的lastIndex属性在作怪。lastIndex从字面上来讲就是最后一个索引,实际上它的意思是正则表达式开始下一次查找的索引位置,第一次的时候总是为0的,第一次查找完了的时候会把lastIndex的值设为匹配到得字符串的最后一个字符的索引位置加1,第二次查找的时候会从lastIndex这个位置开始,后面的以此类推。如果没有找到,则会把lastIndex重置为0。要注意的是,lastIndex属性只有在有全局标志正则表达式中才有作用,如果我们把上面代码中正则表达式的g标志去掉,那么三次弹出的就都是true了。

exec()方法同样是如此,exec()方法返回的是一个数组,数组的第一个元素是匹配到的字符串,之后的元素则分别对应匹配到的字串,也就是正则表达式中用括号括起来的那些。如果使用exec()方法的正则表达式没有全局标志,则只会匹配第一个,如果正则表达式有全局标志,则可以循环使用exec()来得到所有的匹配,直到exec()返回null为止,也就是找不到匹配了。这里能够循环使用同一个正则表达式的exec()方法,靠的就是lastIndex,因为带全局标志的正则表达式每次匹配后都会更新lastIndex的值作为下次查找匹配的起点。

最后要说明的是字符串的正则方法里lastIndex属性是不起作用的,不管正则模式是不是全局的。

 

 

理解(正向|反向)(肯定|否定)预查可以参考:https://www.jb51.net/article/166953.htm  

https://blog.csdn.net/qq_34763438/article/details/77856204

posted on 2020-01-10 17:03  半夏微澜ぺ  阅读(183)  评论(0编辑  收藏  举报