附:「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
正则表达式结构
正则表达式结构分为2大类:字符直接量和元字符
字符直接量: 字母和数字 == 自身(也就是说数字就是数字,字母就是字母),\n 换行符 ,\t 制表符,\r 回车符 , \f 换页符
元字符:正则表达式中有许多标点符号有着特殊的含义。
- 例如:^代表字符串的开头,$代表字符串的结尾,点号.表示出换行符之外的任意字符,等等。这些字符称为元字符 。
- 如果需要以直接量的形式使用元字符,则需使用\来转义。 例如,如果表示直接量字符^ ,在使用正则表达式字面量时就需要转义,写出^ ;在使用RegExp构造函数时,需使用\转义,写成\^
正则表达式
正则表达式的语法主要涉及: 字符类、量词、候选、子表达式、锚字符
1.字符类
(1)将直接量字符放进方括号[]内,就可以组合成字符类。
var str = "abeda";
var reg = /[abc]da/;
if(reg.test(str)){
console.log("true");
}else {
console.log("false");
}
代码分析: /[abc]da/ 表示只要是字符串"ada","bda","cda"这三种可能都匹配,返回true。其他字母,返回false。所以这里 "abeda"是返回false
(2) 还可以定义字符类的否定,使用 ^ 字符。
var str = "abeda";
var reg = /[^abc]da/;
if(reg.test(str)){
console.log("true");
}else {
console.log("false");
}
代码分析:/[^abc]da/ 表示只要是非字符串"ada",“bda”,"cda"这三种可能都匹配,返回true。其他字母,返回false。所以这里 "abeda"是返回true,因为它不匹配这三种可能
(3) 如果要表示某个范围类的字符,还可以使用连字符-。
情况1:[0-9]匹配0到9之间的任意一个数字,如果加^,就表示不是数字字符都可以。
var str = "abeda";
// var reg = /[0-9]da/; // 只要是0-9都可以,返回true
var reg = /[^0-9]da/; // 加上^后,表示只要不是数字都可以
if (reg.test(str)) {
console.log("true");
} else {
console.log("false");
}
情况2:[a-zA-Z]匹配a到z之间的任意大小写字母,如果加^,就表示不是字母字符都可以。
var str = "abeda";
// var reg = /[a-zA-Z]da/; // 这样也可以,意思是包含所有a-z区间,无论大小写字母
var reg = /[^a-zA-Z]da/; // 加上^后,表示只要不是字母都可以
if (reg.test(str)) {
console.log("true");
} else {
console.log("false");
}
(4) 某些字符类用的非常多,所以Javascript中包含了一些特殊字符和转义序列来表示这些常用的字符类。
- 例如,\s表示任意的空白字符,\S表示任意的非空白字符
- 使用场景:比如说一篇文章内容都是用空格字符隔开的,此时我们可以使用\s来区分空白字符,然后把空格字符换成逗号,以逗号形式隔开。
var str = "abe da";
var reg = /\sda/;
if (reg.test(str)) {
console.log("true");
} else {
console.log("false");
}
(5) 字符类例子
var str1 = "11d22";
var reg1 = /\d\d[abc-e]\w/; // 一一对应str1中数值进行匹配
document.write(reg1.test(str1)); //输出true
代码分析:
\d匹配一个数字字符。等价于 [0-9][abc-e]表示区间,这里是等价于abcde\w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]',也就是任意大小写字母和数字。
2.量词
字符类都只匹配单个字符。如果要匹配5个数字,可以使用正则表达式/\d\d\d\d\d/, 这样做是比较麻烦的。量词就可以解决类似问题。
- 量词可以指定某个特定模式出现的次数。当指定某个模式应当出现的次数时,可以硬性指定其出现的次数。例如,指定某个字符出现4次,也可以指定软性数量。 例如,这个字符至少出现一次。
情况 1: 没有使用量词的正则表达式,这里是多次输入\d,\d表示的意思是:匹配一个数字字符。等价于 [0-9]。
var str1 = "11d22";
var reg1 = /\d\d[abc-e]\w/;
document.write(reg1.test(str1)); //输出true
情况 2 : 使用量词的表达式,这里是将上面出现多次\d代码,写成\d{2},表示\d这样的字符可以出现2次。
var str1 = "11d22";
var reg1 = /\d{2}[abc-e]\w/; // \d{2} 表示任意单个数字字符,可以出现2次
document.write(reg1.test(str1)); //输出true
情况 3 : 多种字符情况下,量词的使用
var str1 = "a11d22AAAA";
var reg1 = /\d{2}[a-z]\d{2}A+/;
document.write(reg1.test(str1)); //输出true
代码分析: /\d{2}[a-z]\d{2}A+/
\d{2}表示:任意数字字符可以出现2次[a-z]表示:a-z区间任意字母字符\d{2}表示:任意数字字符可以出现2次 -A+表示:至少出现1次或者多次
情况 4: 量词案例,小细节注意!
var str1 = "122321341424a11d22AAAA";
var reg1 = /\d{2}[a-z]\d{2}A+/;
document.write(reg1.test(str1)); //输出true
这个情况下也是返回true,无论你写多少,只要其他的一段字符满足正则表达式都是可以的,而不是看开头是什么。但是如果这个正则表达式加上了 ^ 和 $,这个例子就一定是返回false的。
补充:
^表示匹配输入字符串的开始位置$则匹配输入字符串的结束位置
3. 候选
有时要构建一个匹配所有可能性的模式是很困难的。例如,要用正则表达式匹配 "hello" 和 ”javascript” 要如何做呢?
正则表达式提供了候选操作符 “|” 来解决这种问题。“|” 类似于“或者”的意思。
var str1 = "hello";
var str2 = "javascript";
var reg1 = /hello|javascript/;
document.write(reg1.test(str1)); //输出true
document.write(reg1.test(str2)); //输出true
情况 1: 候选的使用场景,多项选择
- 老身份证号码(16位)和二代身份号码(18位)
- 手机号(11位数字)和座机号(一般7-8位数)
- 2000年(00后) 和 1990年 (90后)
(1)身份证验证
var str1 = "431103199920217890";
var str2 = "4311031999202178";
var reg = /18位|16位/; // 可以是18位也可以是16位
(2)手机号和座机号验证
var str1 = "17675849086";
var str2 = "021-69776543";
var reg = /手机号|座机号/;
(3)00后和90后验证
var str1 = "2000-02-01";
var str2 = "1993-04-06";
var reg = /00后|90后/;
4.子表达式
子表达式用于处理字符序列
- 例如:需要匹配
hellohello,可以构造如下正则表达式:/hellohello/,使用子表达式,则可以写成:/(hello){2}/。
<script>
var reg = /([bd]ad?)*/;
var str1 = "";
var str2 = "ba";
var str3 = "da";
var str4 = "bad";
var str5 = "dad";
var str6 = "badba";
var str7 = "dadbadda";
document.write(reg.test(str1));
document.write(reg.test(str2));
document.write(reg.test(str3));
document.write(reg.test(str4));
document.write(reg.test(str5));
document.write(reg.test(str6));
document.write(reg.test(str7));
</script>
代码分析:/([bd]ad?)*/
[bd]ad表示字符串“bd”,“bdce”,都可以匹配。?匹配前面的子表达式零次或一次,例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
5.锚字符
对于正则表达式/he/,字符串”he”,”hello”,”hefda”都可以与之匹配。但有时我们只需要找出一篇文章中所有的单词”he”,而”hello”等则不需要找出。这时要将正则表达式修改为/\bhe\b/ 。这里的\b是正则表达式中锚字符 。
\b匹配词语的边界。即位于\w和\W之间的位置\B匹配非词语边界的字符^匹配字符串的开头$匹配字符串的结尾
6.常用正则表达式
(1)
- 验证用户名和密码:
/^[a-zA-Z]\w{5,15}$/。正确格式:由字母、数字、下划线组成,并且第一个字必须为字母,6~16位; - 验证电话号码:
/^(\d{3,4}-)\d{7,8}$/。正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx; - 验证身份证号:
/^\d{17}[\d|X]|\d{15}$/ - 验证Email地址:
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ - 只能输入由数字和26个英文字母组成的字符串:
/^[A-Za-z0-9]+$/ - 整数或者小数:
/^[0-9]+\.{0,1}[0-9]{0,2}$/ - 只能输入数字:
/^[0-9]*$/ - 只能输入n位的数字:
/^\d{n}$/
(2)
- 只能输入至少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/*$ - 只能输入长度为3的字符:
/^.{3}$/ - 只能输入由26个英文字母组成的字符串:
/^[A-Za-z]+$/
(3)
- 只能输入由26个大写英文字母组成的字符串:
/^[A-Z]+$/ - 只能输入由26个小写英文字母组成的字符串:
/^[a-z]+$/ - 只能输入汉字:
/^[\u4e00-\u9fa5]{0,}$/ - 验证URL:
/^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/ - 验证一年的12个月:
/^(0?[1-9]|1[0-2])$/。正确格式为:01~09和10~12 - 验证一个月的31天:
/^((0?[1-9])|((1|2)[0-9])|30|31)$/。正确格式为01~09/和10~31。24.匹配首尾空白字符的正则表达式:/^\s*|\s*$