RegExp 对象

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

直接量语法

/pattern/attributes

创建 RegExp 对象的语法:

new RegExp(pattern, attributes);

 RegExp 示例:

new RegExp("regexp","g")    的直接量语法为     /regexp/g

参数

参数模式 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。

参数标志 attributes 是一个可选的字符串,包含属性 "g"、"i" "m",分别用于指定全局匹配、区分大小写的匹配多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

返回值

一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。

如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。

抛出

SyntaxError - 如果 pattern 不是合法的正则表达式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常。

TypeError - 如果 pattern 是 RegExp 对象,但没有省略 attributes 参数,抛出该异常。

 

修饰符

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配,而非在找到第一个匹配后停止)
m 执行多行匹配。

 

方括号

方括号用于查找某个范围内的字符:

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符,全部大小写字符
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的任一个选项,选其之一

 

元字符

元字符(Metacharacter)是拥有特殊含义的字符:

元字符 描述
. 查找单个字符,除了换行和行结束符。
\w 查找单词字符,匹配任意是字母,数字,下划线,汉字的字符
\W 查找非单词字符,匹配任意不是字母,数字,下划线,汉字的字符
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符,去除空格用,例如: str=str.replace(/\s*/g,"")
\S 查找非空白字符,匹配可见字符用
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

 

量词

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

 

RegExp 对象属性

属性 描述 FF IE
global RegExp 对象是否具有标志 g 1 4
ignoreCase RegExp 对象是否具有标志 i 1 4
lastIndex 一个整数,标示开始下一次匹配的字符位置 1 4
multiline RegExp 对象是否具有标志 m 1 4
source 正则表达式的源文本 1 4

 

RegExp 对象方法

方法 描述 FF IE
compile 编译正则表达式。 1 4
exec 检索字符串中指定的值。返回找到的值,并确定其位置。 1 4
test 检索字符串中指定的值。返回 true 或 false。 1 4

 

支持正则表达式的 String 对象的方法

方法 描述 FF IE
search 检索与正则表达式相匹配的值。 1 4
match 找到一个或多个正则表达式的匹配。 1 4
replace 替换与正则表达式匹配的子串。 1 4
split 把字符串分割为字符串数组。 1 4

 

JS 正则表达式的转义符

JS使用字符串创建的正则表达式:反斜杠"\"也需要加转义符:

var reg1=new RegExp("\\w+");       这和直接使用:var reg2=    /\w+/  他们是等价的

A方案:

var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
if (reg.test(input)) {
  return true;
}

B方案:

this.email = "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$";

_this.isEmail = function (str) {
  return new RegExp(window.LoginValidateRegExp.email).test(str);
};

总结:当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)

比如,以下是等价的:

var re = new RegExp("\\w+");
var re = /\w+/;

 

 

JS 正则表达式验证数字

验证数字:^[0-9]*$ 

验证n位的数字:^\d{n}$ 

验证至少n位数字:^\d{n,}$ 

验证m-n位的数字:^\d{m,n}$ 

验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 

验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 

验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 

验证非零的正整数:^\+?[1-9][0-9]*$ 

验证非零的负整数:^\-[1-9][0-9]*$ 

验证非负整数(正整数 + 0) ^\d+$ 

验证非正整数(负整数 + 0) ^((-\d+)|(0+))$ 

验证长度为3的字符:^.{3}$ 

验证由26个英文字母组成的字符串:^[A-Za-z]+$ 

验证由26个大写英文字母组成的字符串:^[A-Z]+$ 

验证由26个小写英文字母组成的字符串:^[a-z]+$ 

验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 

验证由数字、26个英文字母或者下划线组成的字符串:^\w+$ 

验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 

验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+ 

验证汉字:^[\u4e00-\u9fa5],{0,}$ 

验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 

验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 

验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。 

验证身份证号(15位或18位数字):^\d{15}|\d{18}$ 

验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12” 

验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。 

整数:^-?\d+$ 

非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$ 

正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 

非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 

负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 

浮点数 ^(-?\d+)(\.\d+)?$

代码示例:

<script type="text/javascript">  
     function validate(){  
       var reg = new RegExp("^[0-9]*$");  
       var obj = document.getElementById("name");  
    if(!reg.test(obj.value)){  
        alert("请输入数字!");  
    }  
    if(!/^[0-9]*$/.test(obj.value)){  
        alert("请输入数字!");  
    }  
  }  
</script>  

 

JS 正则表达式验证中文

var str ='北京上海'; 	// 用户输入
if(/^[\u4e00-\u9fa5]+$/i.test(str)){
	alert('全是中文’);
}

 

JS 验证密码(检验密码是含有小写字母、大写字母、数字、特殊符号的两种及以上)

网页注册功能,需要写一个正则表达式来检验一个密码是否含有小写字母、大写字母、数字、特殊符号的两种及以上组合,密码不少于6位(6-40位),增强密码安全性

^(?![A-Z]+$)(?![a-z]+$)(?!\d+$)(?![\W_]+$)\S{6,40}$

解释说明:

表达式比较长,分解成多个小字符串解释说明

1)(?![A-Z]+$)

?! 是正则表达式的语法,含义如 ?!n 表示匹配任何其后没有紧接指定字符串 n 的字符串,?表示匹配的意思,!表示否的意思

[A-Z]+$ 表示从当前位置到结尾($)都是大写字母的匹配

![A-Z]+$ 表示从当前位置到结尾($)匹配的不能全部是大写字母的字符串

?![A-Z]+$ 表示从当前位置到结尾($)匹配的不能全部是大写字母的字符串,则匹配它,否则执行后面的匹配表达式规则

(?![A-Z]+$) 表示匹配不能全部是大写字母的字符串,即全部是大写字母则不符合要求

 

2)(?![a-z]+$) 

同理,(?![a-z]+$) 匹配不能全部是小写字母的字符串,若全部是小写字母则不符合要求

同理,(?!\d+$) 匹配不能全部是数字的字符串,若全部是数字的字符串则不符合要求

 

3)(?![\W_]+$)

\w 表示包含大小写字母、数字、下划线的的字符串匹配

\W 表示不是大小写字母、不是数字、不是下划线的的字符串匹配,即特殊字符

[\W_] 表示不是大小写字母、不是数字、不是下划线的的字符串匹配,即特殊字符加上下划线_

 

4)(?![A-Z]+$)(?![a-z]+$)(?!\d+$)(?![\W_]+$)

四个小括号并列的含义,是并列与的关系,即必须全部条件都同时满足,但这里是否定式的不匹配,因此需同时满足匹配不全部是大写字母、小写字母、数字、特殊字符的字符串,即至少包含两个组合以上,例如 大写和小写字符串、大写和数字字符串、数字和特殊字符串等组合

 

5)\S{6,40}

\s 表示不可见的空格

\S 表示可见的字符,可以是大写字母、小写字母、数字、特殊字符、中文等

\S{6,40} 表示可见的字符的长度必须在 6 - 40 位之间,即密码最少6位,最多40位

 

6)^(?![A-Z]+$)(?![a-z]+$)(?!\d+$)(?![\W_]+$)\S{6,40}$

^ 表示开头,$表示结尾,全部合起来看就是密码字符串必须是可见字符6-40位之间,且不能全部是大写字母、不能全部是小写字母、不能全部是数字、不能全部是特殊字符,因此只能是含有小写字母、大写字母、数字、特殊符号的两种及以上的字符串组合

 

JS 验证密码(检验密码是含有小写字母、大写字母、数字、特殊符号的三种及以上)

^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![a-z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{6,40}$

上面已经详细介绍了包含小写字母、大写字母、数字、特殊符号的两种及以上的正则表达式语法,还没看的或不懂的可以详细看上面的正则基本语法解释,这里只介绍下三种及以上的匹配思路

1)(?![a-zA-Z]+$) 匹配不全部是字母的字符串(大写字母 + 小写字母)

2)(?![A-Z0-9]+$) 匹配不全部是大写字母和数字的字符串(大写字母 + 数字)

3)(?![a-z0-9]+$) 匹配不全部是小写字母和数字的字符串(小写字母 + 数字)

4)(?![A-Z\W_!@#$%^&*`~()-+=]+$) 匹配不全部是大写字母和特殊字符的字符串(大写字母 + 特殊字符)

5)(?![a-z\W_!@#$%^&*`~()-+=]+$) 匹配不全部是小写字母和特殊字符的字符串(小写字母 + 特殊字符)

6)(?![0-9\W_!@#$%^&*`~()-+=]+$) 匹配不全部是数字和特殊字符的字符串(数字 + 特殊字符)

7)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{6,40} 匹配是小写字母、大写字母、数字、特殊符号的字符串,长度必须在 6 - 40位之间,即符合全部四种字符的强密码

注意:这里可能会有人问,为什么没有排除单独是小写字母,或大写字母,或数字,或特殊字符的只有一种字符的字符串匹配呢?嗯,实际上是已经匹配并排除了,我们拿一个来分析看:

(?![a-zA-Z]+$) 匹配不全部是字母的字符串(大写字母 + 小写字母),若全部是小写字母,或大写字母,则也包含在此匹配内,符合属于大小写字母的匹配规则,被排除了

好了,到此可见,包含至少三种以上组合,就是把符合只有一种、二种字符组合的可能性都排除了,就剩下只有至少三种以上的组合了,其包含四种字符组合是最好的强密码字符串。

 

JS 验证密码(检验密码是含有字母、数字、特殊符号的三种及以上)

上面的方法,都是采用排除法(?!)做的正则匹配,实际上也可以使用匹配法(?=)来做正则匹配

^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]).{6,40}$

1)(?=.*[a-zA-Z]) 匹配满足含有字母(大小写字母的小写、大写、或大小写)

2)(?=.*\d) 匹配满足含有数字

3)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]) 匹配满足含有特殊字符

4).{6,40} 匹配满足单个字符数必须在 6 - 40位之间的长度

合起来就是必须要匹配字母、数字、特殊符号的三种及以上

 

JS 正则表达式的匹配写法

JS 正则匹配,至少有两种以上的写法,这里介绍常见的两种

<script type="text/javascript">
	// 验证密码,字母 + 数字 + 特殊字符三种必须同时具备(字母大小写不限)
	function validPwd(pwd) {
		var pwdReg = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()|\W_+`\-={}:";'<>?,.\/\[\]]).{6,40}$/g;
		var pwdReg = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()|\W_+`\-={}:";'<>?,.\/\[\]])\S{6,40}$/g;
		if( pwdReg.test(pwd) ) {
			return true;
		}
		return false;
	}
	
	// 验证密码,字母 + 数字 + 特殊字符三种必须同时具备(字母大小写不限)
	function validPwd2(pwd) {
		var pwdReg = new RegExp("^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()\|\\W_+`\\-={}:\";\'<>?,.\\/\\[\\]]).{6,40}$", "g");
		if( pwdReg.test(pwd) ) {
			return true;
		}
		return false;
	}
	
	
	// 验证密码,大写字母 + 小写字母 + 数字 + 特殊字符四种任选三种及以上
	function validPwd3(pwd) {
		var pwdReg = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![a-z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{6,40}$/;
		if( pwdReg.test(pwd) ) {
			return true;
		}
		return false;
	}
	
	// 验证密码,大写字母 + 小写字母 + 数字 + 特殊字符四种任选三种及以上
	function validPwd4(pwd) {
		var pwdReg = new RegExp("^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![a-z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{6,40}$", "g");
		if( pwdReg.test(pwd) ) {
			return true;
		}
		return false;
	}
	
	
	var pwd = 'mimvp2066';		// 字母 + 数字
	document.write(pwd + " - validPwd: " + validPwd(pwd) + ", validPwd2: " + validPwd2(pwd) + "<br>");
	document.write(pwd + " - validPwd3: " + validPwd3(pwd) + ", validPwd4: " + validPwd4(pwd) + "<br><br>");
	
	var pwd = 'Mimvp@com';		// 字母 + 特殊符号
	document.write(pwd + " - validPwd: " + validPwd(pwd) + ", validPwd2: " + validPwd2(pwd) + "<br>");
	document.write(pwd + " - validPwd3: " + validPwd3(pwd) + ", validPwd4: " + validPwd4(pwd) + "<br><br>");
	
	var pwd = '2016@2066';		// 数字 + 特殊符号
	document.write(pwd + " - validPwd: " + validPwd(pwd) + ", validPwd2: " + validPwd2(pwd) + "<br>");
	document.write(pwd + " - validPwd3: " + validPwd3(pwd) + ", validPwd4: " + validPwd4(pwd) + "<br><br>");
	
	var pwd = '2066@mimvp';		// 数字 + 字母 + 特殊符号
	document.write(pwd + " - validPwd: " + validPwd(pwd) + ", validPwd2: " + validPwd2(pwd) + "<br>");
	document.write(pwd + " - validPwd3: " + validPwd3(pwd) + ", validPwd4: " + validPwd4(pwd) + "<br><br>");
	
	var pwd = '2066[mimvp]';		// 数字 + 字母 + 特殊符号
	document.write(pwd + " - validPwd: " + validPwd(pwd) + ", validPwd2: " + validPwd2(pwd) + "<br>");
	document.write(pwd + " - validPwd3: " + validPwd3(pwd) + ", validPwd4: " + validPwd4(pwd) + "<br><br>");
	
	var pwd = '$2066_mimvp]';		// 数字 + 字母 + 特殊符号
	document.write(pwd + " - validPwd: " + validPwd(pwd) + ", validPwd2: " + validPwd2(pwd) + "<br>");
	document.write(pwd + " - validPwd3: " + validPwd3(pwd) + ", validPwd4: " + validPwd4(pwd) + "<br><br>");
</script>

运行结果:

mimvp2066 - validPwd: false, validPwd2: false
mimvp2066 - validPwd3: false, validPwd4: false

Mimvp@com - validPwd: false, validPwd2: false
Mimvp@com - validPwd3: true, validPwd4: true

2016@2066 - validPwd: false, validPwd2: false
2016@2066 - validPwd3: false, validPwd4: false

2066@mimvp - validPwd: true, validPwd2: false
2066@mimvp - validPwd3: true, validPwd4: true

2066[mimvp] - validPwd: true, validPwd2: false
2066[mimvp] - validPwd3: true, validPwd4: false

$2066_mimvp] - validPwd: true, validPwd2: false
$2066_mimvp] - validPwd3: true, validPwd4: false

问题:

1)2066@mimvp - validPwd: true, validPwd2: false

2)$2066_mimvp] - validPwd3: true, validPwd4: false

推荐:

密码正则匹配的密码推荐格式

var pwdReg = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()|\W_+`\-={}:";'<>?,.\/\[\]])\S{6,40}$/g;

 

 

参考推荐:

JS 手机号、电话号码正则表达式

JS 去除字符串中的空格

PHP 正则表达式

PHP 正则匹配提取网页内容

PHP 正则表达式过滤常用标签

PHP 判断数字,字母,特殊符号,中文

Python 正则匹配re模块

Python学习入门(13)——正则表达式

Python 正则表达式爬取网页分析HTML标签总结

MySQL 正则表达式查询

Linux grep 正则表达式

JavaScript RegExp 对象