9.正则表达式

99 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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_]+)?$/

正则工具使用

地址:tool.oschina.net/regex/

地址:tools.jb51.net/regex/creat…

使用 RegExp(正则表达式) 对象的方法

  1. bool RegExpObject.test(string) 检索字符串是否匹配。

返回 true 或 false

var reg = /^1([3-8]){1}\d{9}$/;
alert(reg.test(13837160809));
  1. 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 对象的方法

  1. array stringObject.match(regexp)

检索字符串 以找到一个或多个与 regexp 匹配的文本。 regexp 具有标志 g则全局匹配,否则只匹配一次

var str="1 plus 2 equal 3";
document.write(str.match(/\d+/g))
  1. string stringObject.replace(regexp,replacement)  替换
name = "jack, Rose";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
  1. array stringObject.split(separator,howmany)   分割成数组
var str="How1are2 you 3doing 7today?";
alert(str.split(/\s+/));
  1. int stringObject.search(regexp) 检索字符串中第一个与 regexp 相匹配的子串的起始位置。

如果没有找到任何匹配的子串,则返回 -1。

var str="I'm studying web前端!"
document.write(str.search(/web/i))