正则表达式(js) 含有(正向预查和负向预查)

来源:互联网 发布:网络信息安全培训课件 编辑:程序博客网 时间:2024/06/05 11:52

第一次见到正则表达式的时候,感觉好难啊,要记得东西怎么那么多.学了好几遍,但还是很蒙圈,可能是用的少,平时用的时候也就那么基础需要使用,再者就是复制粘贴正则表达式.

那么什么是正则表达式呢?正则表达式就是一个描述字符规则的对象.那为什么会有正则表达式呢,这里引用沫晴姐姐的一句话,就是因为计算机笨呗(沫晴姐姐引用别人的话).比如123@qq.com,这个一看就知道是邮箱,课时计算机还有一个个的验证.
不说了,直接进入主题吧.

为了减轻验证数据的工作量,用正则就行.

如何创建正则表达式

1.第一种方式:

var reg = new RegExp("string","lg");//第二个参数为修饰符 

i: 表示忽略大小写,英文ignore
g:表示全局匹配,即查找所有的,英文global

2.第二种方式:

var reg = /string/ig;

正则对象的方法

test:用来检索指定值,返回值为true和false

let reg = /s/ig;console.log(reg.test("study"));///返回trueconsole.log(reg.test("tudy"));///返回false

exec:用来检索字符串中的是否有匹配值,有的话则返回一个数组,没有匹配到,则返回null.

let reg = /s/ig;console.log(reg.exec("studystudy"));///[ 's', index: 0, input: 'studystudy' ]console.log(reg.exec("studystudy"));///[ 's', index: 5, input: 'studystudy' ],继续上一次的位置继续console.log(reg.exec("good"));//null

注意:若没有指定g修饰符,则每次从开始匹配,否则,conf上次匹配结束为止开始匹配

字符串函数

search: 匹配是否有匹配值,返回字符串中的第一个与正则表达式想匹配的子字符串的起始位置,没有找到返回-1.

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

match: 找到一个或多个正则表达式的匹配值

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

replace: 替换与正则表达式匹配的值

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

split: 把字符串分割成数组

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

正则表达式构成

正则表达式由普通字符(例如字母)和特殊字符(例如+)构成,组成的文字模式.

1.字符匹配符
\s : 空格
\S : 非空格
\d : 数字
\D : 非数字
\w : 字符 ( 字母 ,数字,下划线_ )
\W : 非字符例子:是否有不是数字的字符

let reg = /\d/ig;console.log("123go567odstudysboy".match(reg)); ///打印[ '1', '2', '3', '5', '6', '7' ]

(其余的我就不试了)

[xyz]: 匹配x,y,z任意一个字符, 例如[23w]
[^x,y,z]: 匹配不包含x,y,z的字符, 例如[^12w]
[a-z]: 匹配a-z之间的任意字符, 例如[1-5]
[^a-z]匹配非a-z之间的任意字符, 例如[^1-5]

2.限定符
* : 匹配>=0次
+ : 匹配>=1次
? : 匹配0或1次
{n} : 匹配n次
{n, } : 匹配至少n次
{n, m} : 匹配至少n次,最对m次

注意: 正则表达式很贪婪的,所以他会尽可能的多的去匹配,
凡是限定符后面紧跟? , 则他会减少贪婪的欲望

3.定位符
^ : 匹配字符串开始的位置
$ : 匹配字符串结束的位置
\b : 匹配单词的边界, 就是单词和空格之间的位置
\B : 匹配非单词边界

4.转义字符
\ : 转义某也特殊的字符, 例如匹配$符号

5.转义字符
| : 匹配多个规则

6.特殊用法
() : 捕获型分组,即子表达式,使用\1,\2,\3…对子组的引用
(?:pattern) : 非捕获型分组.匹配pattern但不获取匹配结果。也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。

(?=pattern) : 正向预查,在任何匹配pattern的字符串开始处匹配字符串.非获取字符串.就是匹配pattern字符串,但不返回pattern,返回的是与pattern匹配的字符串但要把pattern去掉.
举个例子,我们 匹配windows后面是7,8,8.1的,只留windows

var str = "windows98 windows7 windows8 windows8.1 windows10 windowsVista windowsXP";var reg = /windows(?=7|8\.1|8)/g;var a = str.match(reg);console.log(a); //返回[ 'windows', 'windows', 'windows' ]

(?!pattern) : 负向预查,匹配与正向预查相反,返回的是不是匹配到pattern的值,也就是正向预查的补集,举个栗子,匹配后面windows后面不是7,8,8.1的值,只留windows

var str = "windows98 windows7 windows8 windows8.1 windows10 windowsVista windowsXP";var reg = /windows(?!7|8\.1|8)/g;var a = str.match(reg);console.log(a);////返回[ 'windows', 'windows', 'windows' ,'windows']

还是不明白的看图,图画的丑,别介意啊,毕竟我不是艺术生.
这里写图片描述
图中,大黑框相当于字符串,小框表示单词,然后给每个小框编号,黑阴影部分表示要匹配的部分,当使用正向预查时,匹配的结果是: 1中的空白部分和4中的空白部分. 当使用负向预查时,匹配的结果是: 2中和3中的空白部分

有错误的地方,请指出谢谢

原创粉丝点击