正则表达式(regular express)是用于匹配字符串中字符组合的模式。RegExp的exec和test方法
正则可视化工具https://github.com/CJex/regulex
例题参考连接https://lyctea.github.io/2018/05/01/cjsydwxz600kqbf6p1g2eu8xr/
正文
1、创建
regexp = new RegExp('pattern','flags')
regexp = /pattern/
regexp = /pattern/(gmi)
2、正则表达式中的特殊字符
字符 | 含义 |
---|---|
\ | 转义字符 |
^ | 匹配输入开始 |
$ | 匹配输入结束 |
* | 匹配任意次,等价于{0,} |
+ | 匹配至少1次,等价于{1,} |
? | 匹配0或1次,等价于{0,1} |
. | 匹配除换行符以外的任何单个字符 |
(x) | 捕获括号 匹配’x’并且记住匹配项 |
(?:x) | 非捕获括号 匹配’x’但不记住匹配项 |
x(?=y) | 先行断言 匹配’x’,仅当x后面跟着’y’ |
(?<=y)x | 后行断言 匹配’x’,仅当x前面是’y’ |
(x(?!y)) | 反向否定查找,匹配‘x’,x后面不是y |
| | 或者 |
{n} | 匹配前面一个字符串刚好出现了n次 |
{n,} | 匹配至少出现了n次 |
{n,m} | 匹配至少出现了n次 ,最多出现m次 |
[xyz] | 一个字符集合,可以使用(-)指定字符范围[abcd]=[a-d] |
[^xyz] | 一个反向字符集 |
\d | 数字 |
\D | 非数字 等价于[^0-9 ] |
\f | 换页符 (U+000C) |
\n | 换行符(U+000A) |
\r | 回车符(U+000D) |
\t | 水平制表符tab(U+0009) |
\v | 垂直制表符(U+000B) |
\s | 空白字符(空格、制表符、换页符、换行符) |
\S | 非空白字符 |
\w | 匹配数字、字母、下滑线 等价于 [A-Za-z0-9_] |
\W | 匹配非数字、字母、下滑线 等价于 [^A-Za-z0-9_] |
\n | n 取值1-9,取匹配的第n个子字符串 |
\0 | 匹配null(U+0000) |
替换文本中的$字符有特殊含义:
1、$1、$2、…、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
2、$& 与 regexp 相匹配的子串。
3、$` 位于匹配子串左侧的文本。
4、$’ 位于匹配子串右侧的文本
5、$$ 普通字符$。
eg:'abc'.replace(/b/g, "{$$$`$&$'}")
// 结果为 "a{$abc}c",即把b换成了{$abc}
3、使用正则表达式
exec | 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组,未匹配到则返回null |
test | 一个在字符串中测试是否匹配的RegExp方法,返回true或者false |
match | 一个在字符串中执行查找匹配的string方法,返回一个数组,未匹配到返回null |
matchAll | 一个在字符串中执行查找所有匹配的string方法,发货一个迭代器iterator |
search | 一个在字符串中测试匹配的string方法,返回匹配到的位置索引,失败返回-1 |
replace | 一个在字符串中执行查找匹配的string方法,并替换匹配到的子字符串 |
split | 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的string方法 ‘’abcdefg’.split(‘c’) =>[“ab”,”defg”] |
4、通过标志进行高级搜索
g | 全局搜索 |
m | 多行搜索 |
i | 不区分大小写搜索 |
s | 允许.匹配换行符 |
u | 使用Unicode的模式进行匹配 |
y | 执行’粘性搜索’,匹配从目标字符串的当前位置开始 |
5、优先级顺序
1 | \ 转义符 |
2 | (), (?😃, (?=), [] 括号和中括号| |
3 | *、+、?、{n}、{n,}、{n,m} 限定符 |
4 | 任何元字符^、$、\ 定位点和序列 |
5 | |替换 |
6、实例
手机号正则
/^(13[0-9]|14[5-9]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[13589])\d{8}$/
function showTel(){
let tel = document.getElementById('myTel').value;
if(!/^(13[0-9]|14[5-9]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[13589])\d{8}$/.test(tel)){
alert(`${tel}手机格式错误`);
}else{
alert(`${tel}手机格式正确`);
}
}
固定电话正则
/^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/
身份证号正则
//身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
//身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)
/^[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{3}([0-9]|X)$/
/(^\d{15}$)|(^\d{17}([0-9]|X)$)/
/(^\d{15}$)|(^\d{17}([0-9]|X)$)/
统一社会信用代码正则
按照编码规则:
统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I、O、Z、S、V)组成,由五个部分组成:
第一部分(第1位)为登记管理部门代码,9表示工商部门;(数字或大写英文字母)
第二部分(第2位)为机构类别代码;(数字或大写英文字母)
第三部分(第3-8位)为登记管理机关行政区划码;(数字)
第四部分(第9-17位)为全国组织机构代码;(数字或大写英文字母)
第五部分(第18位)为校验码(数字或大写英文字母)
/[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/g
密码正则
6-12位数字,字母组合:/^[A-Za-z0-9]{6,12}$/
6-12位数字,字母,下滑线:/^\w+$/
6-12位数字,字母,下滑线,特殊字符 /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,12}$/
(?![0-9]+$) 后面不是纯数字
(?![a-z]+$) 后面不是纯小写字母
(?![A-Z]+$) 后面不是纯大写字母
(?!([^(0-9a-zA-Z)])+$) 后面不是纯 非数字字母(特殊字符)
邮箱正则
var reg = /^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$/;
return reg.test(sEmail);
去掉字符串首位空格
replace(/(^\s*)|(\s*$)/g, ""))
内容不能以空格开头
/[^\s]/
其他
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
提取信息中的中国身份证号码:\d{18}|\d{15}
提取信息中的整数:\d+
提取信息中的浮点数(即小数):(-?\d*)\.?\d+
提取信息中的任何数字 :(-?\d*)(\.\d+)?
提取信息中的中文字符串:[\u4e00-\u9fa5]*
提取信息中的双字节字符串 (汉字):[^\x00-\xff]*
7、题库
- 匹配连续出现是四组以.连接的字符串 题目:abc.dss.sds.wer
/(.{3}\.){3}/g
- 转换为驼峰命名 题目:var s1=“get-element-by-id” 转换成getElementById
'get-element-by-id'.replace(/-\w+/g,function(x){return x.slice(1,2).toUpperCase()+x.slice(2)})
- 判断字符串是否包含数字 题目:var s1 = ‘arhs 23jydjsasd 234 dhi’
/\d+/g.test(s1)
- 判断电话号码
/^1[0-9]{10}$/ /^1\d{10}/
- 判断是否符合指定格式 xxx-xxx-xxxx 其中x为number类型,eg var s1=‘234-234-2343’
/^\d{3}-\d{3}-\d{4}$/g /^(\d{3}-){2}\d{4}$/g
- 判断是否符合美元usd格式 eg var s1=‘$1,023,032.03’
美元格式规则:以$开始,两位小数,整数部分从个位起,满三位用,分隔。例如$1,234,234.98. 错误示范:$5,55,55.555
/^\$\d{1,3}(,\d{3})*(\.\d{2})?$/g
- Js 实现千位分隔
‘34872673’.replace(/^\d{1,3}(?=(\d{3})+$)/g,’$&,’) // $&表示与regx相匹配的字符串
- 获取URL中的参数
http://localhost:8870/?name=hello&name=world&id=12#/
getUrlParam(name) {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
var r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURI(r[2]);
return null;
}
let name = this.getUrlParam('id');
console.log(name, 123);
// 说明:该正则匹配的是 & + url参数名称 + 值&,其中&可以不要
'(^|&)’ 表示以xxx开头,或者以&开头 eg: name=xx,&name=xx
([^&]*) 表示匹配以&开头的任意值,
(&|$) 表示跟在前面匹配到的字符必须是&或者$(任意字符)
window.location.search 这个是取URL上的search字段,是?xxx=xxx… 以这里为例值就是?name=hello&name=world&id=12
.substr(1) substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。以这里为例,取1,就是name=hello&name=world&id=12
.match(reg) 得到的结果就是["&id=12", "&", "12", "", index: 21, input: "name=hello&name=world&id=12", groups: undefined]
- 验证邮箱
邮箱有很多种格式,在这里总结一下。
qq邮箱:xxx@qq.com
163邮箱:xxx@163.com
新浪邮箱:xxx@sina.cn/xxx@sina.com
雅虎邮箱:大陆:xxx@yahoo.com.cn /台湾:xxx@yahoo.com.tw /美国:xxx@yahoo.com
谷歌邮箱:xxx@gmail.com
其他邮箱:xxx@126.com/xxx@139.com/xxx@sohu.com/xxx@hotmail.com
所以邮箱的验证,就统一为xxx@xxx.xxx
(/^[a-zA-Z0-9\u4E00-\u9FA5]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)$/).test('hqin@qq.com')
\u4E00-\u9FA5 :表示中文
- 匹配汉字
/^[\u4E00-\u9FA5]$/
- 去除首尾的’/’
/(?<=\/)(\S+)(?=\/)/
- 判断日期格式是否符合’yyyy-mm-dd’的形式,简单判断,只判断格式
/^(\d{4})(-\d{2}){2}$/
- 判断日期格式是否符合’yyyy-mm-dd’的形式,严格判断(比较复杂)
// 判断日期是否正确,月小于等于12,日期分大月31小月30和2月,闰年2月是29,平年是28
// 额…哎…
- ipv4地址正则
0.0.0.0 - 255.255.255.255
0-199 200-249 250-255
/^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/
- 十六进制颜色正则
'/^#([a-fA-F\d]{6}|[a-fA-F\d]{3})$/'
- 车牌号正则
京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新
ABCDEFGHJKLMNPQRSTUVWXY (无 I, O , Z 三个字母。其中O和Z属于特殊车牌类型)
民用车牌规则
普通车牌(蓝牌、黄牌)
车牌号码长度:7 位
/^[京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新][ABCDEFGHJKLMNPQRSTUVWXY][\dABCDEFGHJKLNMxPQRSTUVWXYZ]{5}$/
新能源车牌
车牌号码长度:8 位
/^[京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新][ABCDEFGHJKLMNPQRSTUVWXY][1-9DF][1-9ABCDEFGHJKLMNPQRSTUVWXYZ]\d{3}[1-9DF]$/
- 过滤HTML标签
需要使用非贪婪模式
var newContent = Regex.Replace(htmlContent, "<span.*?>.*?</span>", String.Empty);
- URL正则
/^(?:(http|https|ftp):\/\/)?((?:[\w-]+\.)+[a-z0-9]+)((?:\/[^/?#]*)+)?(\?[^#]+)?(#.+)?$/i
- 匹配标签内数据,包括标签
/<[^>]*>/g 以<开头,一直往后找非>的字符串,找到>为止
最后说明:很多题都是断断续续积累起来的,没有记录到题目到出处。答案可自行验证,小白自己也验证过,如有任何问题,请不令赐教,谢谢