持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
JS正则
正则表达式
- 官方定义:正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
- 正则表达式是由一个字符序列形成的搜索模式。
- 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
- 正则表达式可以是一个简单的字符,或一个更复杂的模式。
- 作用:正则表达式可用于所有文本搜索和文本替换的操作。
正则表达式的构成
- 定界符
- 元字符
- 模式修正符
- 表达式
定界符
定界符常使用斜线“/” 左斜杠 正斜杠 /
/ 元字符 /[修饰符] g
/\w+/ // 使用反斜线作为定界符合法
元字符
元字符为具有特殊含义的字符
主要用途:
- 定义原子的筛选方式
- 定义原子的集合
- 定义原子数量限定
- 定义边界控制
元字符集合
元字符 | 含义描述 | |
---|---|---|
* | 匹配0次、1次或多次其前的原子 | |
+ | 匹配1次或多次其前的原子 | |
? | 匹配0次或1次其前的原子 | |
. | 匹配除了换行符外的任意一个字符 | |
匹配两个或多个分支选择 | ||
{n} | 表示其前面的原子恰好出现n次 | |
{n,} | 表示其前面的原子出现不小于n次 | |
{n,m} | 表示其前面的原子至少出现n次,最多出现m次 | |
匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后) | ||
$ | 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行符之前) | |
\b | 匹配单词的边界 | |
\B | 匹配除单词边界以外的部分 | |
[] | 匹配方括号中指定的任意一个原子 | |
[^] | 匹配除方括号中的原子以外的任意一个字符 | |
( ) | 匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子 |
元字符之原子的筛选方式
方括号用于查找某个范围内的字符:
筛选方式 | 含义描述 | |
---|---|---|
匹配坚线两边的任意一个原子 | ||
[] | 匹配方括号中的任意一个原子 | |
[^] | 匹配除方括号中原子之外的任意字符 |
元字符之原子的集合
集合 | 含义描述 |
---|---|
. | 查找单个字符,除了换行和结束符。 [ ^\n\r] |
\d | 匹配0-9的数字,相当于[0-9] |
\D | 匹配除0-9之外的任意字符,相当于[ ^0-9 ] |
\s | 匹配一个空白字符,相当于[\f\n\r\t\v ] |
\S | 匹配一个非空白字符,相当于[^\f\n\r\t\v |
\w | 匹配任意一个数字、大小写字母和下划线字符,相当于[0-9a-zA-Z_] |
\W | 匹配任意一个非数字、大小写字母和下划线字符,相当于[ ^0-9a-zA-Z ] |
元字符之原子数量限定
数量限定 | 含义描述 |
---|---|
{n} | 其前面的原子连续出现n次 |
{n,} | 其前面的原子至少连续出现n次 |
{n,m} | 其前面的原子连续出现n到m次 |
+ | 匹配任何包含至少一个 n 的字符串。{1,} |
* | 匹配任何包含零个或多个 n 的字符串。{0,} |
? | 匹配任何包含零个或一个 n 的字符串。{0,1} |
元字符之边界控制
边界控制 | 含义描述 |
---|---|
^ | 写在正则表达式最前面表示必须以什么开始 |
$ | 写在正则表达式最后表示必须以什么结束 |
\b | 匹配单词边界 This is an island |
\B | 匹配非单词边界 |
模式修饰符
量词 | 含义描述 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
js效果-使用实现以下验证
非空
/^[\s\S]*.*[^\s][\s\S]*$/
[\s\S]* 前面可以为任意字符
.*[^\s] 任意非空格和非换行字符
邮箱
(1)、^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
(2)、/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
手机号
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
座机:/^(0\d{2,3})-?(\d{7,8})$/
URL地址
(1)匹配没有特殊要求的url
/^(http|ftp|https):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?^/
(2)匹配 https:/******.jd.com
/^https:\/\/([\w]([\w\-]{0,61}[\w])?\.)+jd\.com/
(3)匹配 mall.jd.com/index-*****…
/^https:\/\/mall\.jd\.com\/index-([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\.html/
(4) 匹配https://******.taobao.com
/^https:\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\.taobao\.com/
(5) 匹配mobile.yangkeduo.com/mall_page.h…****
^http:\/\/mobile\.yangkeduo\.com\/mall_page\.html\?mall_id\=[\w\-\.,@?^=%&:\/~\+#]+
汉字
[\u4E00-\u9FA5\s]+ 多个汉字,包括空格
[\u4E00-\u9FA5]+ 多个汉字,不包括空格
[\u4E00-\u9FA5] 一个汉字
日期格式
(1).匹配日期格式:yyyy-MM-dd HH:mm:ss
^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$
(2).匹配日期格式:yyyy-MM-dd
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|"+ "((0[48]|[2468][048]|[3579][26])00))-02-29)$;
3.匹配日期格式:yyyy/MM/dd
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\/(((0[13578]|1[02])\\/(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)\\/(0[1-9]|[12][0-9]|30))|(02\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|"+ "((0[48]|[2468][048]|[3579][26])00))\\/02\\/29)$;
(4).匹配日期格式:yyyy/MM/dd HH:mm:ss
((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\/(((0[13578]|1[02])\\/(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)\\/(0[1-9]|[12][0-9]|30))|(02\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|"+ "((0[48]|[2468][048]|[3579][26])00))\\/02\\/29))\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$;
(5).匹配日期格式:yyyyMMdd
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|"+ "((0[48]|[2468][048]|[3579][26])00))0229)$
(6).匹配日期格式:yyyyMMddHHmmss
((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))"+ "([0-1][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$
(7).匹配格式:yyyyMMddHHmmssSSS
((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|"+ "((0[48]|[2468][048]|[3579][26])00))0229))([0-1][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])([0-9]{3})$
(8).匹配格式:yyyyMMdd HH:mm:ss
((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|"+ "((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|"+ "((0[48]|[2468][048]|[3579][26])00))0229))\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$
身份证号码
(1)普通校验
/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
(2)精准校验
/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
(3)15位
/^[1-9]\d{5}\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$/
(4)后六位
/^(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
QQ号码
/^[1-9][0-9]\d{4,9}$/
邮政编码
/^[1-9]\d{5}$/
注册账号
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/
以字母开始包含字母、数字、下划线的用户名
/^[a-zA-Z_]([a-zA-Z0-9_]+)?$/
正则工具使用
地址:tools.jb51.net/regex/creat…
使用 RegExp(正则表达式) 对象的方法
- bool RegExpObject.test(string) 检索字符串是否匹配。
返回 true 或 false
var reg = /^1([3-8]){1}\d{9}$/;
alert(reg.test(13837160809));
- array RegExpObject.exec(string) 检索字符串中指定的值。
返回找到的值,并确定其位置。
var str = "I like to eat apples, and my name is apple";
var reg = new RegExp("apple","g");
var result;
while(result = reg.exec(str)){
alert(result);
alert(reg.lastIndex);
}
支持正则表达式的 String 对象的方法
- array stringObject.match(regexp)
检索字符串 以找到一个或多个与 regexp 匹配的文本。 regexp 具有标志 g则全局匹配,否则只匹配一次
var str="1 plus 2 equal 3";
document.write(str.match(/\d+/g))
- string stringObject.replace(regexp,replacement) 替换
name = "jack, Rose";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
- array stringObject.split(separator,howmany) 分割成数组
var str="How1are2 you 3doing 7today?";
alert(str.split(/\s+/));
- int stringObject.search(regexp) 检索字符串中第一个与 regexp 相匹配的子串的起始位置。
如果没有找到任何匹配的子串,则返回 -1。
var str="I'm studying web前端!"
document.write(str.search(/web/i))