题目来源于牛客网前端专题:
https://www.nowcoder.com/ta/front-end?page=1
https://www.nowcoder.com/ta/js-assessment
https://www.nowcoder.com/ta/coding-interviews
其他常用正则总结https://www.jianshu.com/p/4fb6354708e6
一、表单验证常用
(结合
test
方法)
一般验证输入是否符合标准,需要加上^$
匹配整个字符串
1.颜色
/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/
rgb(255, 255, 255)格式的10进制颜色,可以带空格
/^#?(\w{6}|\w{3})$/
十六进制颜色,字符可以出现 3 或 6 次,需要是用量词和分支结构。
2.用户名
/^\w{4,16}$/
4到16位(字母,数字,下划线,减号)
3.时间
/^[01]\d|[2][0-3]:[0-5]\d$/
24 小时制,0/1和2开头的情况分支。共 4 位数字,第一位数字可以为 [0-2]。 当第 1 位为 “2” 时,第 2 位可以为 [0-3],其他情况时,第 2 位为 [0-9]。 第 3 位数字为 [0-5],第4位为 [0-9]。
/^(0?\d|1\d|2[0-3]):(0?\d|[1-5]\d)$/
前面的 “0” 可以省略。时钟0,1,2开头分支,分钟0和1-5开头分支
4.日期
/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
年份四位数字,月份0(不可为00),1分支,日期0(不可为00),12(0-9),3(0-1)分支
/\d{4}(-|\/|\.)\d{2}\1\d{2}/
连接符号可以是. - /的日期,反向应用绑定前面的获取
5.验证密码问题
/(?=.*\d)(?=.*[a-z])^\w{6,12}$/
密码长度 6-12 位,由数字、小写字符和大写字母,下划线组成,但必须包括数字和英文。
先试验(?=.*[0-9])(?=.*[a-z])\b\w{6,12}\b
,发现确实只匹配字母和数字的结合的密码:
具体原理:
只需要弄明白 (?=.*[0-9])^
即可。分开来看就是 (?=.*[0-9])
和 ^
。
^
表示开头前面的位置【也就是开头位置,因为位置都是空字符串,n个位置叠加起来还是一个位置】。.*[0-9]
,表示有0~n个任意字符,后面再跟一个数字。【也就是数字位置是任意的,可以在密码的开头,也可以在中间】(?=.*[0-9])^
表示在字符串开头位置的后面(也就是整个字符串中),必须要有.*[0-9]
——一个任意位置的数字,也就是这串密码必须有数字。
6.邮箱字符串判断
邮箱前面的域名可能没有.xxx,数量为0-n;后面的域名格式一定为xxx.xxx,.xxx数量为1-n
function isAvailableEmail(sEmail) {
if(sEmail.length<5){
return false;
}
return /^\w+(\.\w+)*@\w+(\.\w+)+$/.test(sEmail);
}
7.身份证
/^(\d{15}|\d{17}[\dxX])$/
判断是否包含数字
var num =/\d/;
return num.test(str);
8.不匹配任何东西
/.^/
9.检查重复字符串
给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false
只能通过反向引用来检查
function containsRepeatingLetter(str) {
if(str.length<=1){
return false;
}
return /([a-zA-Z])\1/.test(str);
}
10.检查重复单词
\b(\w+)\b\s+\1\b
11.判断是否以元音字母结尾
给定字符串 str,检查其是否以元音字母结尾
1、元音字母包括 a,e,i,o,u,以及对应的大写
2、包含返回 true,否则返回 false
注意如果用分支,需要用括号,否则$会跟随最后一个分支
function endsWithVowel(str) {
if(str===""){
return false;
}
return /[aeiouAEIOU]$/.test(str)
}
12.判断字符串是否为XXX-XXX-XXXX格式
function matchesPattern(str) {
if(str.length<12){
return false;
}
return /^\d{
3}-\d{
3}-\d{
4}$/.test(str);
}
13.判断是否符合 USD 格式
给定字符串 str,检查其是否符合美元书写格式
1、以 $ 开始
2、整数部分,从个位起,满 3 个数字用 , 分隔
3、如果为小数,则小数部分长度为 2
4、正确的格式如:$1,023,032.03 或者 $2.03,错误的格式如:$3,432,12.12 或者 $34,344.3
function isUSD(str) {
if(str.length<=1){
return false;
}
return /^\$[1-9]\d{
0,2}(,\d{
3})*(\.\d{
2})?$/.test(str);
}
$,.
需要转义
第一部分:[1-9]\d{0,2}
,首位不能为0,可能为1-3位
第二部分:(,\d{3})*
,逗号➕三位数字,可能出现0-n次
第三部分:(\.\d{2})?
,小数点➕小数点后两位,可能出现0-1次
14.模拟一个正则表达式匹配函数test
题目描述 https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
正则表达式分成四部分:[+-]?
匹配符号,\d*
匹配小数点前的数字,(\.\d+)?
匹配小数点后的数字,([eE][+-]?\d+)?
e和e部分以后的指数。
function isNumeric(s) {
// write code here
return /^[+-]?\d*(\.\d+)?([eE][+-]?\d+