JS 正则表达式
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;
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2019-01-11 13:35:02
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: JS 正则表达式 (米扑博客)