正则表达式
-
字面量写法
语法:
var patt=/pattern/modifiers;
- 模式(pattern)描述了一个表达式模型。
- 修饰符(modifiers)描述了检索是否是全局,区分大小写等。
例子:
var str = 'mjj' var p = /mjj/g var result = p.test(str) console.log(result)
-
构造函数写法
语法:
// RegExp regular expression
var patt=new RegExp(pattern,modifiers);例子:
var str1 = 'mjj' var p1 = new RegExp('mjj','g') var result1 = p1.test(str) console.log(result1) // true
元字符
以下操作可以通过 https://regexr.com/ 网站进行操作,可以验证匹配
.
匹配任意字符
var str2 = 'hello world'
var p2 = /./g;
var result2 = p2.test(str2)
console.log(result2) // true
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sr1HxSpE-1619344716479)(…/pic/regexp/regexp1.png)]
^
匹配字符串开始的位置
$
匹配字符串结束的位置
\w
匹配数字和字母下划线 [A-Za-z0-9_]
\W
匹配非数字和非字母 [^A-Za-z0-9_]
\d
匹配数字
\D
匹配非数字
\s
空白字符
\S
非空白字符
[]
字符集合
/[\u4e00-u9fa5]/g //中文
[^] 集合内的
^
代表取反
+
匹配重复一次或者多次 runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)
*
匹配重复0次或者多次 runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)
?
匹配重复0次或者1次 colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)
{} 重复次数 {2} {1,7}
() 分组匹配捕获
| 或者
RegExp.$1 捕获匹配
?: 分配不捕获 (?:http|https)
正向预查 (?=) 正向否定预查(?!) (?!=元|\d)
200元 2000元 200刀 200磅
反向预查 (?<=¥) (?<!¥|\d)
字符串方法
test()
返回一个布尔值,表达当前模式能否匹配 。到 true 不匹配 false
exec()
match()
var str="The rain in SPAIN stays mainly in the plain";
var n=str.match(/ain/g);
匹配到返回一个匹配数组,没有匹配到null
search()
匹配到返回索引,没有匹配 返回-1
replace()
var s = "2020.12.01"
console.log(s.replace(/\./,'-'))
//2020-12.01
console.log(s.replace(/\./g,'-'))
//2020-12-01
练习
-
检查用户账号
//用户名: 字母、数字、下划线组成,以字母开头 4-16位 function checkUserName(str) { let rule = /^[a-zA-Z]\w{3,15}$/g return rule.test(str) } var str = 'a123_ksdf' console.log("result:") console.log(checkUserName(str))
-
匹配手机号
// 11位 以1开头 3 5 7 8 function checkPhone(str) { let rule = /^1[3|5|7|8]\d{9}$/g return rule.test(str) } var str = '1366626195' console.log("result:") console.log(checkPhone(str))
-
匹配电话号码
// 验证规则:区号 + 号码 function checkPhone(str) { let rule = /^0\d{2,3}-?\d{7,8}$/g return rule.test(str) } var str1 = '010-88888888' var str2 = '0532-6767676' var str3 = '01088888888' console.log("result:") console.log(checkPhone(str1)) console.log(checkPhone(str2)) console.log(checkPhone(str3))
-
匹配身份证
// 15 位 全是数字 18位 前17位是数字最后一位数字或者字符x X function checkCard(str) { let rule = /^\d{15}$|^\d{17}(\d|x|X)$/g return rule.test(str) } var str1 = '1234567891234555' var str2 = '0532-6767676' var str3 = '01088888888' console.log("result:") console.log(checkCard(str1)) console.log(checkCard(str2)) console.log(checkCard(str3))
-
匹配邮箱
-
判断字符串是否是这样组成的:第一个必须是字母,后面可以是字母、数字、下划线,总长度为5-20。如果符合条件返回1,否则返回0。
function checkString(str){ let rule = /^[a-zA-Z]\w{4,19}$/g return rule.test(str)?1:0 }
-
提取区号
var sss = "我的银行账号是xxxxx,我的电话号码是0731-888888,将这段文本中的区号提取出来" sss.match(/(\d{4})-/g) console.log(RegExp.$1)
-
判断一个五位数字是否是回文数
-
给一个连字符串例如:get-element-by-id转化成驼峰形式
function convertValue(params) { return params.replace(/-([a-z])/g,(match,$1)=>{ return $1.toUpperCase() }) } var strValue = "get-element-by-id" console.log(convertValue(strValue))
-
给一个连字符串例如:getElementById转成连接符形式get-element-by-id
function convertValue(params) { return params.replace(/[A-Z]/g,(match)=>{ return '-'+ match.toLowerCase() }) } var strValue = "getElementById" console.log(convertValue(strValue))
-
匹配二进制数字
var str = "10101010"; var reg = /^[01]+$/g; console.log(reg.test(str));
-
非零的十进制数字 (有至少一位数字, 但是不能以0开头)
var str = "81"; var reg = /^[1-9][0-9]*$/g; console.log(reg.test(str));
-
匹配一年中的12个月
var str = "12"; var reg = /^(0?[1-9]|1[0-2])$/g; console.log(reg.test(str));
-
分割数字每三个以一个逗号划分
var str = "12345678901"; function numSplit(str){ var re = /(\d)(?=(\d{3})+$)/g; //(\d{3})+$ 的意思是连续匹配 3 个数字,且最后一次匹配以 3 个数字结尾。 //要找到所有的单个字符,这些字符的后面跟随的字符的个数必须是3的倍数,并在符合条件的单个字符后面添加, return str.replace(re,'$1,'); } console.log(numSplit(str));
-
匹配用尖括号括起来的以a开头的字符串
var str = "<a herf='www.baidu.com'>"; var reg = /<a[^>]+>/g; console.log(str.match(reg));
-
匹配ip地址
var str = "255.221.221.12"; // [01]?\d\d?表示匹配小于199的数,可以说两位数或一位数,2[0-4]\d表示从200到249,配合25[0-5]就表示小于255的数了。 var reg = /(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])$/g; console.log(str.match(reg));
面试题解析:
-
模板字符串填充
var str = '我是一名{0},我来自{1},我的爱好是{2}' var info = ['前端开发工程师', '中国', '旅行'] var newStr = str.replace(/{([0-9])}/g, function (all, val) { return info[val] });
参考