正则表达式
\w 匹配字母数字及下划线
\W 匹配f非字母数字下划线
\s 匹配任意空白字符,等价于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字
\D 匹配任意非数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
- 匹配0个或多个的表达式
- 匹配1个或者多个的表达式
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n前面的表示
{n,m} 匹配n到m次由前面的正则表达式定义片段,贪婪模式
a|b 匹配a或者b
() 匹配括号内的表达式,也表示一个组,()内可以使用|表示或。
[^a-z] 除了a到z的其他所有字符的集合,^符号写在[]里是补集的意思,但它另有其他含义。
例子1:
一个用户注册功能的密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间。
拆分需求如下:
1、不能全部是数字
2、不能全部是字母
3、必须是数字或字母
只要能同时满足上面3个要求就可以了,写出来如下:
^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$
分开来注释一下:
^ 匹配一行的开头位置
(?![0-9]+$) 预测该位置后面不全是数字
(?![a-zA-Z]+$) 预测该位置后面不全是字母
[0-9A-Za-z] {8,16} 由8-16位数字或这字母组成
$ 匹配行结尾位置
注:(?!xxxx) 是正则表达式的负向零宽断言一种形式,标识预该位置后不是xxxx字符。
例子2:
密码必须包含 数字、字母(区分大小写)与特殊字符三种的组合,8-12个字符 的正则。
// ^(?![^a-zA-Z]+$) 表示字符串不能完全由非字母组成,即必须包含字母
// (?!\d+$) 表示字符串不能完全由非数字组成,即必须包含数字
var pwdRule = /^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*.]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&*.]+$)(?![\d!@#$%^&*.]+$)[a-zA-Z\d!@#$%^&*.]{8,12}$/;
if (!pwdRule.test(newPassword)) {
$('.new_error_message').html('密码必须包含数字、字母(区分大小写)与特殊字符三种的组合,8-12个字符')
}
例子3:
校验输入密码的安全性强度–低、中、高
var regxs = [];
// ^ 在 [ ] 里并且在开头,表示匹配时取反,这是正则表达式的用法。
// “[]”代表的是一个字符集,“^”只有在字符集中才是反向字符集的意思
regxs.push(/[^a-zA-Z0-9_]/g); //验证是否包含特殊字符
regxs.push(/[a-zA-Z]/g); //验证是否包含字母
regxs.push(/[0-9]/g); //验证是否包含数字
var count = 0;
// debugger 断点走一遍即可明白
for (var i = 0; i < 3; i++) {
// match()方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
if (val.match(regxs[i])) {
count++
}
}
if (count === 1) {
// 低
} else if (count === 2) {
// 中
} else {
//高
}
常用正则验证
1. 用户名正则校验
//用户名正则,4到16位(字母,数字,下划线,减号)
var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;
//输出 true
console.log(uPattern.test("dishait"));
2. 密码强度正则校验
//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
//输出 true
console.log("=="+pPattern.test("dishait#"));
3. 整数正则校验
//正整数正则
var posPattern = /^\d+$/;
//负整数正则
var negPattern = /^-\d+$/;
//整数正则
var intPattern = /^-?\d+$/;
//输出 true
console.log(posPattern.test("42"));
//输出 true
console.log(negPattern.test("-42"));
//输出 true
console.log(intPattern.test("-42"));
4. 数字正则校验 —可以是整数也可以是浮点数
//正数正则
var posPattern = /^\d*\.?\d+$/;
//负数正则
var negPattern = /^-\d*\.?\d+$/;
//数字正则
var numPattern = /^-?\d*\.?\d+$/;
console.log(posPattern.test("42.2"));
console.log(negPattern.test("-42.2"));
console.log(numPattern.test("-42.2"));
5. Email正则校验
//Email正则
var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
//输出 true
console.log(ePattern.test("1054214757@qq.com"));
6.手机号码正则校验
//手机号正则
var mPattern = /^1[34578]\d{9}$/;
//输出 true
console.log(mPattern.test("17694537162"));
7.身份证号正则校验
//身份证号(18位)正则
var cP = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
//输出 true
console.log(cP.test("510722818878782718"));
8.URL正则校验
//URL正则
var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
//输出 true
console.log(urlP.test("http://unhejing.club"));
9.IPv4地址正则校验
//ipv4地址正则
var ipP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
//输出 true
console.log(ipP.test("123.206.102.179"));
10.十六进制颜色正则校验
//RGB Hex颜色正则
var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
//输出 true
console.log(cPattern.test("#2B2B2B"));
11.日期正则校验
//日期正则,简单判定,未做月份及日期的判定
var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;
//输出 true
console.log(dP1.test("2019-11-11"));
//输出 true
console.log(dP1.test("2019-15-17"));
//日期正则,复杂判定
var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
//输出 true
console.log(dP2.test("2019-02-11"));
//输出 false
console.log(dP2.test("2019-15-11"));
//输出 false
console.log(dP2.test("2019-02-29"));
12.QQ号码正则校验
//QQ号正则,5至11位
var qqPattern = /^[1-9][0-9]{4,10}$/;
//输出 true
console.log(qqPattern.test("1054214757"));
13.微信号正则校验
//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;
//输出 true
console.log(wxPattern.test("unhejing"));
14.车牌号正则校验
//车牌号正则
var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
//输出 true
console.log(cPattern.test("川B203TA"));
15.包含中文正则校验
//包含中文正则
var cnPattern = /[\u4E00-\u9FA5]/;
//输出 true
console.log(cnPattern.test("张三"));
正则常用的6种方法,分为两类
一类是:RegExp对象方法;
1. exce()方法
exec() 方法用于检索字符串中的正则表达式的匹配,如果字符串中有匹配的值返回该匹配值构成的数组,且该数组还有继承的属性;exec()方法没有匹配到数据时返回 null。
index:表示第一个匹配的字符在原字符串中的位置,
input:表示原字符串,
groups:表示当初中命名的分组时匹配到的分组对象;
正则匹配中没有分组时:
var str="Hello45647 123 world!Hello 1423 world! ssfsdf";
var patt1=/\d+/;
var result1=patt1.exec(str);
console.log(result1)
正则匹配中有分组且分组存在名字时:
var str="Hello45647 123 world!Hello 1423 world! ssfsdf";
var patt2=/(?<hello>\d)+/;
var result2=patt2.exec(str);
console.log(result2)
没有匹配到符合正则的字符时:
var str="Hello world!Hello world! ssfsdf";
var patt1=/\d+/;
var result1=patt1.exec(str);
console.log(result1) //null
2. test()方法
方法用于检测一个字符串是否匹配某个模式;如果字符串中有匹配的值返回 true ,否则返回 false。
var str="Hello world!";
//查找"Hello"
var patt1=/Hello/g;
var result1=patt1.test(str);
console.log(result1); //true
//查找 "Runoob"
var patt2=/Runoob/g;
var result2=patt2.test(str);
console.log(result2); //false
二类是:支持正则表达式的String对象的方法:search()、replace()、split()、match()
1. search()方法
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
如果找到任何匹配的子串,则返回该子串在原字符串中的第一次出现的位置。
如果没有找到任何匹配的子串,则返回 -1。
var str1 = 'hello 123 world 456';
var reg1 = /\d+/;
console.log(str1.search(reg1));//6
console.log(str1.search("world"));//10
var str2 = 'hello world';
var reg2 = /\d+/;
console.log(str2.search(reg2));//-1
console.log(str2.search("nihao"));//-1
2. replace()方法
用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
原字符串不变,创建一个新的字符串。
//用一些字符替换另一些字符
var str="hello world! hello world! hello world!";
var n=str.replace('hello',"Runoob");
console.log(str) // hello world! hello world! hello world!
console.log(n) // Runoob world! hello world! hello world!
//替换第一个和替换全部符合正则的子串
var str="hello world! hello world! hello world!";
var a=str.replace(/hello/,"Runoob");
var b=str.replace(/hello/g,"Runoob");
console.log(a) // Runoob world! hello world! hello world!
console.log(b) // Runoob world! Runoob world! Runoob world!
3. split()方法
用于把一个字符串按符合匹配条件的方式分割成一个字符串数组。不改变原字符串。
var str="How 1are 2you 3doing 4today?";
var a=str.split(" ");
var b=str.split(" ",2);
var c=str.split(/\d/);
var d=str.split(/\d/,3);
console.log(a);//["How", "1are", "2you", "3doing", "4today?"]
console.log(b);//["How", "1are"]
console.log(c);//["How ", "are ", "you ", "doing ", "today?"]
console.log(d);//["How ", "are ", "you "]
4. match()方法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
注意:match() 方法将检索字符串 String,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配,与exce的完全一致。
如果 regexp 有标志 g,它将找到全部符合正则子字符串,并返回一个数组。
如果没有找到任何匹配的文本,无论有没有g,match() 将返回 null。
没有g的正则匹配
var str="Hello45647 123 world!Hello 1423 world! ssfsdf";
var patt1=/\d+/;
var result1=str.match(patt1);
console.log(result1)
var str="Hello45647 123 world!Hello 1423 world! ssfsdf";
var patt2=/(?<hello>\d)+/;
var result2=str.match(patt2);
console.log(result2)
有g的正则匹配
var str="The rain in SPAIN stays mainly in the plain";
var n=str.match(/ain/g);
console.log(n); //["ain", "ain", "ain"]
没有匹配到子字符串
var str="The rain in SPAIN stays mainly in the plain";
var n=str.match(/\d/g); //匹配数字
console.log(n); // null
本文部分内容参考:https://www.cnblogs.com/aidixie/p/11212283.html
https://blog.csdn.net/unhejing/article/details/103114234