第一次见到正则表达式的时候,感觉好难啊,要记得东西怎么那么多.学了好几遍,但还是很蒙圈,可能是用的少,平时用的时候也就那么基础需要使用,再者就是复制粘贴正则表达式.
那么什么是正则表达式呢?正则表达式就是一个描述字符规则的对象.那为什么会有正则表达式呢,这里引用沫晴姐姐的一句话,就是因为计算机笨呗(沫晴姐姐引用别人的话).比如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"));///返回true
console.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中的空白部分
有错误的地方,请指出谢谢