正则表达式

2020-04-08  本文已影响0人  darkTi

一、作用

二、创建方式

1、 字面量方式创建(简单、直观,最常用)

let reg = /+86\d{11}/g

2、构造函数方式创建(麻烦,但正则规则可通过字符串拼接,有些场景不得不用)

let reg = new RegExp('+86\d{11}', 'g')

最后的g代表全局,还有几个修饰符:
①g:global,全文搜索,不添加的话搜索到第一个结果停止搜索;
②i:ingore case,忽略大小写,默认大小写敏感;
③m:multiple lines,多行搜索

三、简单用法

1、正则的方法

let reg = /\+86\d{11}/
reg.test('+8615225633220')   //true

2、字符串方法

let str = 'hello1 nct, hello2 wayv'
str.search(/hello\d/)  //0
str.match(/hello\d/g) //["hello1", "hello2"]   匹配符合规则的字符串,以数组格式返回
str.replace(/hello\d/g, 'hi')  //"hi nct, hi wayv"
str.split(/\s/)  //["hello1", "nct,", "hello2", "wayv"]  按规则分隔字符串,以数组格式返回

四、专用字符

1、这些字符在正则中都具有特殊意义,不能直接写在正则中,需要在前面加\转义一下

( [ { \ ^ $ | ) ? * + .

五、字符匹配

1、匹配某一字符串

let reg = /wayv/
reg.test('hello wayv')  // true

当然了,除了用正则匹配外,遇到这种在一个字符串中查找某一字符串是否存在,也可以直接用indexOf

let str = 'hello1 nct, hello2 wayv'
str.indexOf('nct')   //7   存在的话,会返回此目标字符串的第一个字符所在的index
str.indexOf('nt')   // -1  "nt"不存在

2、 范围匹配,[]这种匹配的都是一个字符串

let reg = /[8a\$]/
reg.test('$')   //true

let reg = /不是[67890]0后/
reg.test('我不是00后')  //true
reg.test('我不是80后')  //true
reg.test('我是00后')  //false  因为少个“不”字

六、预定义匹配

let reg = /\W/
reg.test('&')  //true
reg.test('i')  //false

//匹配一个可以是 nct+数字+任意字符 的字符串
let reg = /nct[\d]./
reg.test('nct55')  //true
reg.test('kkknct5 011')  //true
reg.test('nct5')  //false

七、量词

1、可以设定匹配字符串的数量

//  主要区分"?","+","*"的区别
let str1 = 'http://baidu.com';
/https?:\/\/.+/.test(str1)  //true   "s?"没有s或者只有一个s
/https+:\/\/.+/.test(str1)  //false  “s+” 有1个或者多个s
/https*:\/\/.+/.test(str1)  //true  

let str2 = 'https://baidu.com';
/https?:\/\/.+/.test(str2) //true
/https+:\/\/.+/.test(str2) //true
/https*:\/\/.+/.test(str2) //true

let str3 = 'httpssssss://baidu.com';
/https?:\/\/.+/.test(str3) //false
/https+:\/\/.+/.test(str3) //true
/https*:\/\/.+/.test(str3) //true

八、字符串的边界限制

let str = 'hello1 whello9orld hello2 12-hello8-3456 nct hello3 wayv'
str.match(/\bhello\d\b/g)  //["hello1", "hello2", "hello8", "hello3"]
str.match(/^hello/g)  //["hello"]
str.match(/^hello\d/g)  //["hello1"]
str.match(/hello\d$/g)   //null
str.match(/wayv$/g)   //["wayv"]

九、案例

1、匹配手机号,判断用户的输入是否符合手机号规则;
规则:以1开头长度为11的数字;

let reg = /^1\d{10}$/
reg.test('15866523580')  //true
reg.test('15866523580 ')  //false

切记:验证是为了防止用户误操作,不是越严格越好

2、匹配邮箱,判断用户的输入是否符合邮箱规则;
规则:字符串中间包含一个@,@后面的内容包含个.

let reg = /^[^@\s]+@[^@\s]+\.[^@\s]+$/    //[^@\s]表示这个字符不能是@或空白字符
reg.test('8989uhh@163.com')  //true
reg.test('8989uhh@163.中国')  //true
reg.test('898 9uhh@163.com')  //false

3、匹配用户名,判断用户的输入是否是合法用户名;
规则:合法用户名至少8位至多15位,包含大写、小写、数字、下划线至少两种;(有时候不一定非要把规则写在一条正则里,可以分层次来判断,先判断一方面条件,通过了这个条件再判断其他的)

function validUsername(name){
//先判断是否符合8到15位字母数字下划线
    if(!/^\w{8,15}$/.test(name)) return false
//通过了上个条件,再判断是否至少包含两种类型,反过来想就是,不能全是数字字母下划线
    if(!/(^[a-z]+$) | (^[A-Z]+$) | (^\d+$) | (^_+$)/.test(name)) return false
    return true   
}

十、贪婪模式与非贪婪模式

1、'123456789'.match(/\d{3,5}/g) 的结果是什么?

贪婪模式.png
为什么不是['123','456','789']呢,因为match会默认用贪婪模式,就是尽可能多的去匹配;如果不想要贪婪模式,那么就在量词后面加上?即可,即'123456789'.match(/\d{3,5}?/g)
非贪婪模式.png
2、示例
`aa"hello world" or "nct"`.match(/".+"/g)   //[""hello world" or "nct""]

`aa"hello world" or "nct"`.match(/".+?"/g)   //[""hello world"", ""nct""]

十一、分组

1、 就是把一些字符作为一个整体;

//匹配 wayvvv ,而不是 wayvwayvwayv
/wayv{3}/
//用括号把wayv括住,表示是一个整体,这样匹配的才是 wayvwayvwayv
/(wayv){3}/
//匹配的是 “hello world” 和 “hi world”
/(hello)|(hi) wolrd/
//这个是把带数字的hello替换成hi,要保留的部分用括号括住,后面用$1、$2...代替
'hello8 nct, hello9 wayv, hello dream'.replace(/hello(\d)/g, 'hi$1')
image.png
//把div标签换成span标签
'<div>this is a div</div>'.replace(/(<\/?)div(>)/g,'$1span$2') 
//"<span>this is a div</span>"

十二、前瞻

1、nct(?=dream) 表示匹配后面是dream的nct;
2、nct(?!dream) 表示匹配后面不是dream的nct;

/nct(?=dream)/.test('nctdream')  //true
/nct(?=dream)/.test('nctdre')  //false
/nct(?!dream)/.test('nctdream')  //false
/nct(?!dream)/.test('nctwayv')  //true
上一篇下一篇

猜你喜欢

热点阅读