一、(?=pattern)正向预查 :
所谓正向预查就是 ,在任何匹配 pattern 的字符串开始处匹配查找字符串, 要匹配的字符必须满足 pattern 这个条件!
举例:正则表达式/javascript/ 会匹配 javascript。同样也会匹配 javascript2中的 javascript,但如果我们只想匹配 javascript3中的 javascript。我们可以用正向预查:/javascript(?=3)/。

var reg=/javascript(?=3)/;
var str='javascript2';
console.log(reg.exec(str));//null

var reg=/javascript(?=3)/; //javascript 的后面必须是是3
var str='javascript3';
console.log(reg.exec(str));//["javascript", index: 0, input: "javascript3", groups: undefined]

注意:括号里的内容只是条件,并不参与真正的捕获,只是检查后面的字符是否符合要求而已,例如上边的正则返回来 的是javascript ,而不是javascript3
二、(?!pattern) 负向预查
形式 (?!pattern) 和 (?=pattern) 正好相反,要求做匹配的时候,必须不满足pattern这个条件

var reg=/javascript(?!js)/;
var str='javascriptjs';
reg.exec(str);//null  因为正则要求 javascript 后面不能是js

var reg=/javascript(?!js)/;
var str='javascripttest';
reg.exec(str);//["javascript", index: 0, input: "javascripttest", groups: undefined]

看看下面这个正则,你能理解reg1和reg2两个正则表达了相同的意思吗?

var reg2=/(?=^)\d{2}(?=$)/;
var reg2=/^\d{2}$/

三、实战练习:
1、编写一条正则用来验证此规则:一个6-16位的字符串,必须同时包含大小写字母和数字。

let reg=/(?!^[a-zA-Z]+$)(?!^[0-9]+$)(?!^[a-z0-9]+$)(?!^[A-Z0-9]+$)^[a-zA-Z0-9]{6,16}$/;
reg.test('123456');//false
reg.test('123aaa');//false
reg.test('123AAA');//false
reg.test('123aaA');//true
//代码解析:
//先把正常的写好了:^[a-zA-Z0-9]{6,16}$
//在用负向预查 来规定不能是啥,并且写在正常合规代码的前边
// 不能只是大写字母 或者小写字母 或者大小写字母的混合 (?!^[a-zA-Z]+$) 
//不能只是数字 (?!^[0-9]+$)
//不能只是数字和小写字母 (?!^[a-z0-9]+$)
//不能只是数字和大写字母 (?!^[A-Z0-9]+$)
//判断完以上的不能是什么 那么只能是 ^[a-zA-Z0-9]{6,16}$ 这个了

2、// 1-10位:数字、字母、下划线组成字符串,必须有_

let reg=/(?!^[a-zA-Z0-9]+$)^\w{1,10}$/
reg.test('a');//false
reg.test('aC9');//false
reg.test('aC9_');//true

//代码解析:\w 是数字、字母、下划线
//先把正常的写好了:^\w{1,10}
//必须有_,也就是不能只是包含数字和字母  (?!^[a-zA-Z0-9]+$)

3、字符串中包含 "\w",但是必须包含_
let reg=/(?=_)\w+/

标签: none

添加新评论