正则表达式的基础表
基本元字符
如何创建正则表达式
与正则表达式有关的字符串方法
范围元字符
重复元字符
正则表达式是单字符匹配
什么是 RegExp?
RegExp 语法
概念:元字符
RegExp 对象方法
校验数字的表达式
校验字符的表达式
特殊需求表达式
钱的输入格式
常见的 正则表达式 校验
正则表达式概念及语法
正则表达式是遗传用于定义某种模式的字符,属于字符串范畴,有原义字符和元字符两种字符组成。
1.原义字符:书写在正则表达式中表示为字面意思的字符
2.元字符:书写在正则表达式中表示为特定的含义的字符
基本元字符、范围元字符、重复元字符、转义元字符、贪婪匹配,和后向引用。
基本元字符:
1、. 匹配任意字符。
2、* 匹配前一个字符出现的次数为0次或多次。
3、? 匹配前一个字符出现的次数为0次或1次。
4、+ 匹配前一个字符出现的次数为1次或多次。
5、^ 匹配以后面的字符开头。
6、$ 匹配以前面的字符结尾。
7、| 匹配|两端出现的字符中的任意一个,表示“或”的意思。
**如何创建正则表达式:**
1、利用字面量创建正则表达式:
var reg=/abc/;
2、利用构造函数创建正则表达式:
var reg=new RegExp(“abc”);
3、创建正则表达式时可以为正则表达式添加修饰符:
(1)g,表示全局匹配。
(2)i,表示忽略大小写。
例如:利用字面量创建正则表达式。
var reg=/a./gi;
var str='abcdaefgawdA9fa3eweaa';
例如:利用构造函数创建正则表达式。
var reg=new RegExp("a.","gi");
var str='abcdaefgawdA9fa3eweaa';
**与正则表达式有关的字符串方法:**
1、match(reg):
功能:返回字符串匹配正则表达式reg的子串内容。
该功能返回的是一个长得像数组的对象(只匹配第一个子串)或数组(全局匹配)。
例如:match()返回下列格式。
["ab", index: 0, input: "abcdaefgawdA9fa3eweaa", groups: undefined]
索引值为0的元素是匹配正则表达式的唯一结果。
index:返回匹配正则表达式的子串的索引值。
input:返回源字符串。
groups:返回正则表达式的分组结果。
结论:凡是利用match()返回的匹配结果都要带下标。
若字符串没有匹配reg的子串,则返回null。
2、search(reg):
功能:返回字符串匹配正则表达式reg的子串位置。
该功能返回的是一个索引值。
若字符串没有匹配reg的子串,则返回-1。
3、replace():
例1:匹配全部都是由原义字符组成的正则表达式。
var reg=/abc/;
var str='今天我学习了abc';
var a=str.match(reg);
var b=str.search(reg);
console.log(a,b);
例2:第一个元字符(.)。
var reg=/a./;
var str='abcdefg';
var a=str.match(reg);
var b=str.search(reg);
console.log(a,b);
例3:第二个元字符(* ? +)
var str='banana';
var reg1=/an+/; //以a开头,字符n出现了1次或多次的子串
var reg2=/(an)+/; //字符an出现了1次或多次的子串
var a=str.match(reg1); //an
var b=str.match(reg2); //anan
console.log(a,b);
例如:var s=“bannnnann”
var c=str.match(/an*/); //以a开头,字符n出现了0次或多次的子串:annnn
var d=str.match(/an?/); //以a开头,字符n出现了0次或1次的子串:an
例4:第七个元字符(|)
var str=“I like football.”;
var reg=/football|basketball/;
var a=str.match(reg); //[“football”,index:7,input:“I like football”,groups:undefined]
**范围元字符:**
1、[abc] 表示匹配字符a或字符b或字符c。
2、[^abc] 表示匹配除了字符a和字符b和字符c的字符。
3、[a-z] 表示匹配所有的小写字母。
4、[A-Z] 表示匹配所有的大写字母。
5、[0-9] 表示匹配所有的数字。
6、[b-d] 表示匹配小写字母b到d。
注意:这种正则表达式在书写时必须按照从小到大的顺序书写,例如[z-a]是非法的。
**重复元字符:**
1、{m} 限制前一个字符可以重复出现m次。
2、{m,} 限制前一个字符可以重复出现至少m次。
3、{m,n} 限制前一个字符可以重复出现m到n次。
例5:书写一个用来匹配邮政编码的正则表达式。
石家庄的邮政编码 050000。邮政编码的特点:6位数字。
正则表达式:/[0-9]{6}/
例6:书写一个用来匹配带有区号的固定电话的正则表达式。
例如:0311-85047726。
固定电话的特点:区号三位或四位,区号必须以0开头,电话号码七位或八位。
正则表达式:/0[0-9]{2,3}-[0-9]{7,8}/
例7:制作一个表单,表单中有一个要求输入固定电话的文本框,如何利用正则表达式进行表单的验证。
var btnNode=document.querySelector(".btn");
btnNode.addEventListener("click",function(){
event.preventDefault();
var phone=document.getElementsByName("phone")[0];
var reg=/^0[0-9]{2,3}-[0-9]{7,8}$/;
// if(phone.value.match(reg)===null){
// if(phone.value.search(reg)===-1){
if(!reg.test(phone.value)){
alert("您输入的固定电话不符合规格");
}else{
document.forms[0].submit();
}
})
总结:关于判断字符串中是否具备匹配正则表达式的子串,可以有三种方法。
字符串.match(正则表达式)===null //成立,不匹配;不成立,匹配
字符串.search(正则表达式)===-1 //成立,不匹配;不成立,匹配
正则表达式.test(字符串)===false //成立,不匹配;不成立,匹配
**正则表达式是单字符匹配:**
1、1个元字符只能匹配1个字符,或对1个字符进行限制。
2、例8:设一所培训学校的专业讲师的讲师编号为八位字符,是按照下列规律进行编排的:讲师必须以大写字母T开头,接下来的两位表示讲师的入职年份,取值范围规定为10-30,例如某讲师是2017年入职,则这两位应该取值为17。接下来的两位为主讲课程的编号,规定该培训学校共有15门课程需要讲解,即这两位取值范围为01-15。接下来的两位为讲师顺序号,取值范围为01-99,按照讲师入职的先后顺序排列。最后一位是讲师的学历编号,专科学历为“Z”,本科学历为“B”,研究生学历为“Y”,其他学历不予考虑。
结果为:/^T([12][0-9]|30)(0[1-9]|1[0-5])(0[1-9]|[1-9][0-9])(Z|B|Y)$/
**什么是 RegExp?**
RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配。
通常用于格式验证、正则替换、查找子串等
各种编程语言的正则表达式基本相同,不同的语言可能会有一些细小的差别
RegExp 语法
1.// 直接实例化
2.var reg = new RegExp(pattern [, flags])
3.// 隐式创建(推荐)
4.var reg = /pattern/flags;
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 [, flags] 是一个可选的字符串,包含属性 “g”(global )、”i” (ignoreCase)和 “m”(multiline)。
ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
概念:元字符
元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 作用—|—
\ | 转义符 (、)、/、
| | 选择匹配符,可以匹配多个规则
. | 查找单个字符,除了换行和行结束符。
\w | 查找单词字符。字符 ( 字母 ,数字,下划线_ )
\W | 查找非单词字符。
\d | 查找数字。
\D | 查找非数字字符。
\s | 查找空白字符。空格
\S | 查找非空白字符。
\b | 匹配单词边界。
\B | 匹配非单词边界。
\0 | 查找 NUL 字符。
\n | 查找换行符。
\f | 查找换页符。
\r | 查找回车符。
\t | 查找制表符。
\v | 查找垂直制表符。
\xxx | 查找以八进制数 xxx 规定的字符。
\xdd | 查找以十六进制数 dd 规定的字符。
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。
RegExp 对象方法
test()
test() 方法检索字符串中是否存在指定的值。返回值是 true 或 false。
1.var patt1 = new RegExp('e');
2.console.log(patt1.test('some text'));
3.// OUTPUT:true
4.var patt2 = new RegExp('ee');
5.console.log(patt2.test('some text'));
6.// OUTPUT:false
1.// 判断是不是QQ号
2.// 1 首位不能是0 ^[1-9]
3.// 2 必须是 [5, 11] 位的数字 \d{4, 9}
4.var str = '80583600';
5.var regexp = /^[1-9][0-9]{4,10}$/gim;
6.if (regexp.test(str)) {
7. alert('is');
8.} else {
9. alert('no');
10.}
exec()
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
1.var patt1 = new RegExp('e');
2.console.log(patt1.exec('some text'));
3.// OUTPUT:e
4.var patt2 = new RegExp('ee');
5.console.log(patt2.exec('some text'));
6.// OUTPUT:null
compile()
compile() 既可以改变检索模式,也可以添加或删除第二个参数
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free")); // true
// 改变了检索模式
patt1.compile("eee");
document.write(patt1.test("The best things in life are free")); // false
支持正则表达式的 String 对象的方法
search 检索与正则表达式相匹配的值。
1.var str = "Visit W3School!"
2.console.log(str.search(/W3School/))
3.// OUTPUT:6
match 找到一个或多个正则表达式的匹配。
var str="1 plus 2 equal 3"
console.log(str.match(/\d+/g))
// OUTPUT:1,2,3
replace 替换与正则表达式匹配的子串。
1.var str = "Visit Microsoft!"
2.console.log(str.replace(/Microsoft/, "W3School"));
3.// OUTPUT:Visit W3School!
1.// 找重复项最多的字符个数
2.var str = ‘g21ss4aeba_ersb43sgnnsssstht6sss60snnsj8resw0_ss’;
3.// split : 将字符串转化为数组
4.// sort : 对数组排序,ASCII
5.// join : 将数组转化为字符串
var str_new = str.split('').sort().join('');
document.write(str);
document.write(str.split(''));
document.write(str.split('').sort());
document.write(str.split('').sort().join(''));
11.// 匹配字符,且重复这个字符,重复次数至少一次。
var regexp = /(\w)\1+/g;
var index = 0;
var value = '';
str_new.replace(regexp, function($0, $1) {
// document.write($0);
// document.write($1);
if (index < $0.length) {
index = $0.length;
value = $1;. }
});
23.document.write(‘重复项最多的字符是:’ + value + ‘,个数是:’ + index);
24.// OUTPUT:
25.// 0012344668__aabbeeegghjnnnnrrssssssssssssssssttw
26.// 重复项最多的字符是:s,个数是:16
split 把字符串分割为字符串数组。
var str = "How are you doing today?"
document.write(str.split(/\s+/));
// OUTPUT:How,are,you,doing,today?
经验:
检验格式(邮箱格式、IP格式)是否正确,用test()
抓取星期(如所有手机号),用exec()、match()
替换敏感词汇,用replace()
**校验数字的表达式** 1.数字:^[0-9]*$
2.n位的数字:^\d{n}$
3.至少n位的数字:^\d{n,}$
4.m-n位的数字:^\d{m,n}$
5.零和非零开头的数字:^(0|[1-9][0-9]*)$
6.非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
7.带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$
8.正数、负数、和小数:^(-|+)?\d+(.\d+)?$
9.有两位小数的正实数:1+(.[0-9]{2})?$
10.有1~3位小数的正实数:2+(.[0-9]{1,3})?$
11.非零的正整数:3\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$
12.非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
13.非负整数:^\d+$ 或 4\d*|0$
14.非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15.非负浮点数:^\d+(.\d+)?$ 或 5\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
16.非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
17.正浮点数:6\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
18.负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
19.浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$
校验字符的表达式
1.汉字:^[\u4e00-\u9fa5]{0,}$
2.英文和数字:7+$ 或 8{4,40}$
3.长度为3-20的所有字符:^.{3,20}$
4.由26个英文字母组成的字符串:9+$
5.由26个大写英文字母组成的字符串:10+$
6.由26个小写英文字母组成的字符串:11+$
7.由数字和26个英文字母组成的字符串:12+$
8.由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9.中文、英文、数字包括下划线:13+$
10.可以输入含有^%&’,;=?KaTeX parse error: Can't use function '\"' in math mode at position 1: \̲"̲等字符:[^%&',;=?\x22]+
11.禁止输入含有的字符:[^\x22]+
特殊需求表达式
1.Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2.域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3.InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$
4.手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5.电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6.国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7.身份证号(15位、18位数字):^\d{15}|\d{18}$
8.短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9.帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):14[a-zA-Z0-9_]{4,15}$
10.密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):15\w{5,17}$
11.强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
12.日期格式:^\d{4}-\d{1,2}-\d{1,2}
13.一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14.一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
15.xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
16.中文字符的正则表达式:[\u4e00-\u9fa5]
17.双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
18.空白行的正则表达式:\n\s*\r (可以用来删除空白行)
19.HTML标记的正则表达式:<(\S*?)[^>]>.?\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
20.首尾空白字符的正则表达式:^\s*|\s*KaTeX parse error: Undefined control sequence: \s at position 4: 或(^\̲s̲*)|(\s*) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
21.腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
22.中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
23.IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用)
24.IP地址:((??:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
**钱的输入格式:** 1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:16+(.[0-9]+)?$
5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 “10” 和 “10.2” 是通过的:17+(.[0-9]{2})?$
6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:18+(.[0-9]{1,2})?$
7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:19{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
**常见的 正则表达式 校验**
// 常见的 正则表达式 校验
// QQ号、手机号、Email、是否是数字、去掉前后空格、是否存在中文、邮编、身份证、URL、日期格式、IP
var myRegExp = {
// 检查字符串是否为合法QQ号码
isQQ: function(str) {
// 1 首位不能是0 ^[1-9]
// 2 必须是 [5, 11] 位的数字 \d{4, 9}
var reg = /^[1-9][0-9]{4,9}$/gim;
if (reg.test(str)) {
console.log('QQ号码格式输入正确');
return true;
} else {
console.log('请输入正确格式的QQ号码');
return false;
}
},
// 检查字符串是否为合法手机号码
isPhone: function(str) {
var reg = /^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57]|17[678])[0-9]{8}$/;
if (reg.test(str)) {
console.log('手机号码格式输入正确');
return true;
} else {
console.log('请输入正确格式的手机号码');
return false;
}
},
// 检查字符串是否为合法Email地址
isEmail: function(str) {
var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
// var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
if (reg.test(str)) {
console.log('Email格式输入正确');
return true;
} else {
console.log('请输入正确格式的Email');
return false;
}
},
// 检查字符串是否是数字
isNumber: function(str) {
var reg = /^\d+$/;
if (reg.test(str)) {
console.log(str + '是数字');
return true;
} else {
console.log(str + '不是数字');
return false;
}
},
// 去掉前后空格
trim: function(str) {
var reg = /^\s+|\s+$/g;
return str.replace(reg, '');
},
// 检查字符串是否存在中文
isChinese: function(str) {
var reg = /[\u4e00-\u9fa5]/gm;
if (reg.test(str)) {
console.log(str + ' 中存在中文');
return true;
} else {
console.log(str + ' 中不存在中文');
return false;
}
},
// 检查字符串是否为合法邮政编码
isPostcode: function(str) {
// 起始数字不能为0,然后是5个数字 [1-9]\d{5}
var reg = /^[1-9]\d{5}$/g;
// var reg = /^[1-9]\d{5}(?!\d)$/;
if (reg.test(str)) {
console.log(str + ' 是合法的邮编格式');
return true;
} else {
console.log(str + ' 是不合法的邮编格式');
return false;
}
},
// 检查字符串是否为合法身份证号码
isIDcard: function(str) {
var reg = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
if (reg.test(str)) {
console.log(str + ' 是合法的身份证号码');
return true;
} else {
console.log(str + ' 是不合法的身份证号码');
return false;
}
},
// 检查字符串是否为合法URL
isURL: function(str) {
var reg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i;
if (reg.test(str)) {
console.log(str + ' 是合法的URL');
return true;
} else {
console.log(str + ' 是不合法的URL');
return false;
}
},
// 检查字符串是否为合法日期格式 yyyy-mm-dd
isDate: function(str) {
var reg = /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/;
if (reg.test(str)) {
console.log(str + ' 是合法的日期格式');
return true;
} else {
console.log(str + ' 是不合法的日期格式,yyyy-mm-dd');
return false;
}
},
// 检查字符串是否为合法IP地址
isIP: function(str) {
// 1.1.1.1 四段 [0 , 255]
// 第一段不能为0
// 每个段不能以0开头
//
// 本机IP: 58.50.120.18 湖北省荆州市 电信
var reg = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/gi;
if (reg.test(str)) {
console.log(str + ' 是合法的IP地址');
return true;
} else {
console.log(str + ' 是不合法的IP地址');
return false;
}
}
}
// 测试
console.log(myRegExp.isQQ('80583600'));
console.log(myRegExp.isPhone('17607160722'));
console.log(myRegExp.isEmail('[email protected]'));
console.log(myRegExp.isNumber('100a'));
console.log(myRegExp.trim(' 100 '));
console.log(myRegExp.isChinese('baixiaoming'));
console.log(myRegExp.isChinese('小明'));
console.log(myRegExp.isPostcode('412345'));
console.log(myRegExp.isIDcard('42091119940927001X'));
console.log(myRegExp.isURL('https://www.baidu.com/'));
console.log(myRegExp.isDate('2017-4-4'));
console.log(myRegExp.isIP('1.0.0.0'));
0-9 ↩︎
0-9 ↩︎
1-9 ↩︎
1-9 ↩︎
1-9 ↩︎
1-9 ↩︎
A-Za-z0-9 ↩︎
A-Za-z0-9 ↩︎
A-Za-z ↩︎
A-Z ↩︎
a-z ↩︎
A-Za-z0-9 ↩︎
\u4E00-\u9FA5A-Za-z0-9_ ↩︎
a-zA-Z ↩︎
a-zA-Z ↩︎
0-9 ↩︎
0-9 ↩︎
0-9 ↩︎
0-9 ↩︎