正则表达式及常用匹配规则
正则表达式(regular expression) 由表达式+修饰符组成
1.声明方式
a.字面量声明 :var reg = /表达式/修饰符;
b.构造函数:var reg = new RegExp("表达式","修饰符") ;
var reg = /day/ig; // /表达式/ 修饰符: i忽略大小写; g全局匹配(不加则匹配一个) var reg = new RegExp("day", "ig"); // ("表达式", "修饰符")
2.拓展方法 test() / exec()
var str = "good good study, day day up"; var reg = /dAy/ig; // test 若包含符合正则表达式的字符串,返回true,否则返回false console.log(reg.test(str));//true // exec 只匹配一次 ,则提取该字符串形成新数组,不包含则返回null console.log(reg.exec(str));// ["day"]
3.字符串使用正则表达式的函数
a.字符串 match()方法,匹配字符串到新数组(默认匹配一个) 没有匹配内容则返回null
var str = "good good study, day day up"; console.log(str.match("day")); // ["day"] console.log(str.match("dAy")); // null // 配合正则 var reg = /dAy/ig; console.log(str.match(reg)); // ["day", "day"]
b.字符串 replace() 方法 替换匹配的字符串(默认替换一个)
var str = "good good study, day day up"; console.log(str.replace("day", "money")); // "good good study, money day up" // 配合正则 var reg = /day/ig; console.log(str.replace(reg, "money")); // "good good study, money money up"
c.字符串 split() 方法 转换数组
var str = "good good study, day day up"; var reg = / /gi; // var arr = str.split(" "); // 按空格展开 var arr = str.split(reg); // 按空格展开 console.log(111, arr);// ["good", "good", "study,", "day", "day", "up"]
4.普通字符(字面量字符 a-z A-Z 0-9)
5.元字符(有特殊意义的字符)
a.限定符 规定正则表达式中 子表达式出现的次数
* 匹配前边的子表达式出现 0 次 或 多次 {0,}
+ 匹配前边的子表达式出现 1 次 或 多次 {1,}
? 匹配前边的子表达式出现 0 次 或 1次 {0,1}
{n} 匹配前边的子表达式 n次
{n,} 匹配前边的子表达式 最少出现n次
{n,m} 匹配前边的子表达式 最少出现n次 最多出现m次
var str = "good good study, ay ay up"; var reg = /d*ay/ig; console.log("1", reg.test(str)); // true var reg = /d+ay/ig; console.log("2", reg.test(str)); // false var reg = /d?ay/ig; console.log("3", reg.test(str)); // true var reg = /d{1}ay/ig; console.log("4", reg.test(str)); // false var reg = /d{1,}ay/ig; console.log("5", reg.test(str)); // false var reg = /d{0,1}ay/ig; console.log("6", reg.test(str)); // true
b.定位符
^ 匹配字符串的开头
$ 匹配字符串的结尾
^ $ 单一使用不能将规则定死 同时定义会将规则定死
var str = "googleg"; var reg = /^g$/ig; console.log("7", reg.test(str)); // false
c.字符匹配符
[xyz] 匹配这个集合中的任一一个字符(与x|y|z一样), 但方括号里可以写范围, 如:[a-z] 表示小写a到小写z范围的字符
[0-9a-zA-Z$_] 可以包含字符"$ _"
[^0-9] 不包含0-9的任意字符,^ 放在字符组中时叫反义字符组,出现在[]中时是反义的意思
var str = "googleg"; var reg = /^g[a-z]{5}g$/ig; console.log("8", reg.test(str)); // true var reg = /^g[a-z]g$/ig; console.log("9", reg.test(str)); // false var str = "googleg"; var reg = /[^0-9a-zA-Z_$]/; console.log("10", reg.test(str)); // false var str = "google@g"; console.log("11", reg.test(str)); // true
其他匹配字符:
\w 匹配一个可以组成单词(变量)的字符(包括字符,数字,下划线) , 如[\w]匹配“$5.98”中的5,等价于[a - zA - Z0 -9_]。
\W 查找非单词字符。匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^ a - zA - Z0 -9_]。
\d 匹配一个数字字符,/\d/ ==> /[0 - 9]/
\D 匹配一个非数字字符,/\D/ ==> /[^ 0 - 9]/
\s 匹配一个空白字符,包括\n, \r, \f, \t, \v等
\S 匹配一个非空白字符,等于 / [^\n\f\r\t\v] /
. 匹配除换行符\n以外的其他字符
[\u4e00-\u9fa5] 匹配中文字符
d.选择匹配符 |
e.转义字符 \
6.常见匹配规则
检查邮政编码//共 6 位数字,第一位不能为 0 /^[1-9]\d{5}$/ 检查文件压缩包 //xxx.zip\xxx.gz\xxx.rar /^\w+\.(zip|gz|rar)$/ 删除多余空格 // str.replace(/\s+/,''); 删除首尾空格 str.replace(/^\s+/,''); //去除开头的空格 str.replace(/\s+$/,''); // 去除结尾的空格 //删除所有的空格 str.replace(/\s/g,''); //删除前后的空格 str.replace((^\s+)|(\s+$),'') 电子邮件( xxxxx @ xxxx(.xxxx)+) /^\w+@\w+(\.\w+)+$/ 如: 770107@qq.com; 770107@qq.com.cn 手机号(1开头任意数字) 1(3|5|7|8|4)\d{9} /^1\d{10}$/
身份证 /^\d{17}(\d|X)$/ 422422 19660101 5810 421087 19890101 121X ^[1-9]\d{5}[19|20]\d{2}\d{7}(\d|X)$ 日期 (合法日期格式:xxxx-xx-xx或 xxxx/xx/xx或xxxx.xx.xx) /^\d{4}[-\/\.]\d{2}[-\/\.]\d{2}$/ 只能输入中文 str.replace(/[^\u4e00-\u9fa5]/g,''); 账户名只能使用数字字母下划线,且数字不能开头,长度在6-15之间 /^[a-zA-Z_]\w{5,14}$/ 验证IP (xxx.)xxx.xxx.xxx| 254.245.255.255 240.196.19.5 /^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/
首位不为0的整数或两位小数 /^(([1-9]\d*)(\.\d{1,2})?|0\.([1-9]|\d[1-9])|0)$/
身份证号 ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$ 🚧 E.g: 42112319870115371X 用户名 ^[a-zA-Z0-9_-]{4,16}$ 🚧 E.g: jaywcjlove。验证 数字、字母、_、-,不包含特殊字符,长度 4-16 之间。 微信号 ^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$ 🚧 E.g: jslite。微信号正则,6至20位,以字母开头,字母,数字,减号,下划线。 密码强度(宽松) ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 🚧 E.g: diaoD123, Wgood123。必须是包含大小写字母和数字的组合,长度在 8-10 之间。 ^[0-9a-zA-Z\u4E00-\uFA29]*$ 🚧 E.g: diaoD123, Wgood123。数字字母中文。 密码强度(包含特殊字符) ^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$ 🚧 E.g: diaoD123#, Wgood123#$。密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符。 火车车次 ^[GCDZTSPKXLY1-9]\d{1,4}$ E.g: G2868, D22, D9, Z5, Z24, Z17 汉字中文 ^[\u4e00-\u9fa5]{0,}$ 🚧 E.g: 中文, 湖北, 黄冈。不限制文字长度。 ^[\u4e00-\u9fa5]{2,6}$ 🚧 E.g: 中文, 湖北黄冈。2到6位汉字 中文名字 ^(?:[\u4e00-\u9fa5·]{2,16})$ 🚧 E.g: 周杰伦, 古丽娜扎尔·拜合提亚尔, 拉希德·本·穆罕默德·本·拉希德。 英文姓名 (^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$) 🚧 E.g: Gene Kelly, Fred Astaire, Humphrey Bogart, GaryCooper, Cary Grant, Joan Crawford URL ^[a-zA-Z]+:\/\/ 🚧 E.g: http://www.abc.com, http://, https:// ^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$ 🚧 E.g: https://github.com, https://github.com/jaywcjlove ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$ 🚧 E.g: blog.csdn.net Mac地址匹配 ^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$ 🚧 E.g: dc:a9:04:77:37:20 图片后缀 (.jpg|.gif|.png|.jpeg)+(\?|\#|$) 🚧 E.g: a/b/c.jpg?, a/b/c.png, a/b/c.png?good=1 传真号码 ^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$ 🚧 E.g: 086-021-5055452, 021-5055452。国家代码(2到3位),区号(2到3位),电话号码(7到8位),分机号(3位) 手机号码 ^1[34578]\d{9}$ 🚧 E.g: 13611778887 ^((\+?[0-9]{1,4})|(\(\+86\)))?(13[0-9]|14[57]|15[012356789]|17[03678]|18[0-9])\d{8}$ 🚧 E.g: 13611779993, +8613611779993 实例&详细说明 IPv4 地址 (\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3} 🚧 E.g: 192.168.1.1, 127.0.0.1, 0.0.0.0, 255.255.255.255, 1.2.3.4 ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ 🚧 E.g: 192.168.1.1, 127.0.0.1, 0.0.0.0, 255.255.255.255, 1.2.3.4 IPv6 (([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])) 🚧 E.g: 2001:0db8:85a3:0000:0000:8a2e:0370:7334, FE80:0000:0000:0000:0202:B3FF:FE1E:8329。 Email ^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$ 🚧 E.g: wowohoo@qq.com ^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$ 🚧 E.g: wowohoo@qq.com 实例 & 详细说明 十六进制颜色 ^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$ 🚧 E.g: #b8b8b8, #333 ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ 🚧 E.g: #b8b8b8, #333 日期 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$ 🚧 E.g: 2017-02-29。对月份及日期验证。 版本号 ^\d+(?:\.\d+){2}$ 🚧 E.g: 0.1.2。格式必须为 X.Y.Z。 车牌号 ^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:((\d{5}[A-HJK])|([A-HJK][A-HJ-NP-Z0-9][0-9]{4}))|[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])$ 🚧 E.g: 鄂A34324, 沪E13359F。包含新能源车牌。 ^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$ 🚧 E.g: 鄂A34324, 沪E13595。不包含新能源车牌。 小数点后几位 ^[0-9]+(.[0-9]{2})?$ 🚧 E.g: 1.22, 0223.23。精确到 2 位小数 小数 ^\d+\.\d+$ 🚧 E.g: 0.0, 0.23, 10.54。 (-?\d+)(\.\d+)? 🚧 E.g: -0.0, 0.23, -10.54。 正整数 [0-9]*[1-9][0-9]* 🚧 E.g: 23 负整数 -[0-9]*[1-9][0-9]* 🚧 E.g: -23, -2.34 整数 -?\d+ 🚧 E.g: 23, 12, -12.55 非负整数(正整数或零) \d+ 🚧 E.g: 23, 3.322 数字 ^\d{1,}$ 🚧 E.g: 0120,234234。不包含小数。 ^\d{32}$ 🚧 E.g: 12232324444757575757575757575759。32位纯数字。 数字(QQ号码) ^[1-9][0-9]{4,10}$ 🚧 E.g: 398188661。QQ号正则,5至11位。 ^\d{5,11}$ 🚧 E.g: 398188661。更简单的 QQ 号码正则,5~11位数字组成。 中国邮政编码 [1-9]\d{5}(?!\d) 🚧 E.g: 200000。中国邮政编码为 6 位数字。 英文字母 ^[A-Z]+$ 🚧 E.g: ABC,WANG。大写英文字母。 ^[a-z]+$ 🚧 E.g: abc,wang。小写英文字母。 (^[a-z]|[A-Z0-9])[a-z]* 🚧 E.g: Tests,JavaScript,RegEx。大驼峰。 端口号 ^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$ 🚧 E.g: 8080,3000,65535 迅雷链接 ^thunderx?:\/\/[a-zA-Z\d]+=$ 🚧 E.g: 8080。 ed2k链接 ^ed2k:\/\/\|file\|.+\|\/$ 🚧 E.g: ed2k://|file|[xxx.com][%E8%8B%B1%E9%9B%84%E6%9C%AC%E8%89%B23.mp4|/。 磁力链接 ^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$ 🚧 E.g: magnet:?xt=urn:btih:608FA22181A2614BAE9160763F04FCB7ED296B9E 时间 ^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$ 🚧 E.g: 21:54:55,00:23:23。24 小时制时间格式 HH:mm:ss,并且验证时间。 ^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$ 🚧 E.g: 12:54:55,01:23:23。12 小时制时间格式 HH:mm:ss,并且验证时间。 HTML标记 <(\S*?)[^>]*>.*?</\1>|<.*?/> 🚧 E.g: <div>title</div>, <head>title</head>。
常见的手机号正则有 /^1[3456789]\d{9}$/、/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/ 根据运营商的最新号段,手机号验证的最新正则表达式: /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$/ 身份证的正则表达式为: (^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$) ◾ 匹配 16 进制颜色值: /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g; ◾ 匹配日期,如 yyyy-mm-dd 格式 /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/; ◾ 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始) ◾ 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字) ◾ Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ ◾ 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线): ^[a-zA-Z][a-zA-Z0-9_]{4,15}$ ◾ 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线): ^[a-zA-Z]\w{5,17}$ ◾ 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间): ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$ **◾ 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):** ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 🔶 校验数字 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$ 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$ 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$ 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$ 🔶 校验字符 汉字:^[\u4e00-\u9fa5]{0,}$ 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 长度为3-20的所有字符:^.{3,20}$ 由26个英文字母组成的字符串:^[A-Za-z]+$ 由26个大写英文字母组成的字符串:^[A-Z]+$ 由26个小写英文字母组成的字符串:^[a-z]+$ 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$ 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 禁止输入含有~的字符:[^~\x22]+
通过url获取hostname
const urlPath = 'https://nicelinks.site/' const matches = urlPath.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i) const hostname = matches && matches[1] console.debug(`hostname:`, hostname)
如果您想获得更多属性,如 href、protocol、host、port、hash 等,可以将封装一个函数,类似如下代码:
function getLocation(href) { var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/); return match && { href: href, protocol: match[1], host: match[2], hostname: match[3], port: match[4], pathname: match[5], search: match[6], hash: match[7] } } const locationObj = getLocation('https://nicelinks.site/') console.debug(`hostname:`, locationObj.hostname)