【JS】正则表达式的使用

简介

正则表达式(Regular Expression,用来对单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

搜索模式可用于文本搜索和文本替换。

使用

javascript中,创建正则表达式的对象有以下两种方式:

  • 字面量的形式
  • 使用 RegExp 对象

字面量的形式

1
2
3
4
5
var expression = /pattern/flags;
flags参数
i:忽略大小写
g:全局匹配
gi:全局匹配+忽略大小写

RegExp对象

1
var reg = new RegExp(expression, destStr);

使用方法

test()

regexp.test( stringObject )

test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false

1
2
3
reg = new RegExp("B");
str = "abcdABC";
reg.test(str); // true

match()

stringObject.match( regexp )
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

1
2
3
4
reg = new RegExp("B");
str = "abcdABC";
str.match(reg);
// ["B", index: 5, input: "abcdABC", groups: undefined]

replace()

stringObject.replace( regexp, replacement )

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

1
2
3
4
5
reg = new RegExp("B");
reg2 = new RegExp( "B", "g" );
str = "ABCabcdABC";
str.replace( reg, 2 ) // A2CabcdABC
str.replace( reg2, 2 ) // A2CabcdA2C

exec()

RegExpObject.exec(string)

exec() 方法用于检索字符串中的正则表达式的匹配。
该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

1
2
3
4
reg = new RegExp("B");
str = "abcdABC";
reg.exec( str, 2 );
// ["B", index: 1, input: "ABCabcdABC", groups: undefined]

正则表达式元字符

特殊含义的元字符

特殊元字符代表含义
\d0-9之间的任意一个数字 \d只占一个位置
\w数字,字母 ,下划线 0-9 a-z A-Z _
\s空格或者空白等
\D除了\d
\W除了\w
\S除了\s
.除了\n之外的任意一个字符
\转义字符
|或者
()分组
\n匹配换行符
\b匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
^限定开始位置 => 本身不占位置
$限定结束位置 => 本身不占位置
[a-z]任意字母 []中的表示任意一个都可以
[^a-z]非字母 []中^代表除了
[abc]abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符

量词元字符

特殊元字符代表含义
*0到多个
+1到多个
?0次或1次 可有可无
{n}正好n次
{n,}n到多次
{n,m}n次到m次

惰性量词

支配量词

贪婪量词在匹配字符串的时候首先看是否匹配字符串,如果没有找到匹配的则去掉字符串中最后一个字符再次尝试,整个过程一直重复,直到字符串为空时停止。
而惰性量词正好相反,首先查看字符串中第一个字符是否匹配,否则在读入下一个字符在进行匹配,直至重复这个过程到读入整个字符窜都不匹配时停止。

常用的正则表达式

  • 用户名校验

4-16位用户名

1
/^[a-zA-Z0-9_-]{4,16}$/;
  • 密码强度

密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符

1
/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
  • 数字正则

数字正则分为三种情况:
 - 正数正则

1
/^\d*\.?\d+$/;

- 负数正则

1
/^-\d*\.?\d+$/;

- 小数正则

1
/^-?\d+\.?\d{0,2}$/;
  • Email
1
/^[a-z0-9A-Z]+[-|a-z0-9A-Z._]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?.)+[a-z]{2,}$/;
  • 手机号码正则

中国地区的手机号码由11位组成。截至2020年10月,手机号码前两位由13-19组成。
目前三大运营商的手机号段分布如下:

0123456789
0
1
2
3联通联通联通电信移动移动移动移动移动移动
4联通电信移动联通移动移动
5移动移动移动电信联通联通移动移动移动
6联通
7移动电信电信卫联通联通电信移动电信物
8电信电信移动移动移动联通联通移动移动电信
9电信电信广电电信移动联通移动移动电信

携号转网后,号码运营商仅供参考  
移动卫星电话号段 1349
电信天通卫星电话 1740

1
/^1[3-9]\d{9}$/
  • 身份证正则

身份证号码由18位数字或17位数字+字母组成。
(1)前1、2位数字表示:所在省份的代码;
(2)第3、4位数字表示:所在城市的代码;
(3)第5、6位数字表示:所在区县的代码;
(4)第7~14位数字表示:出生年、月、日;
(5)第15、16位数字表示:所在地的派出所的代码;
(6)第17位数字表示性别:奇数表示男性,偶数表示女性;
(7)第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生。

1
2
3
4
5
6
7
8
// 18位
/^[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]$/;

// 15位
/^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$/;

//汇总
/^[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)$/;

对于身份证的校验位,可以使用特定的算法进行计算。通用编码校验小结

  • URL正则

URL由以下几部分组成:协议,服务器主机地址,端口,路径和参数。

1
2
3
4
5
6
7
8
9
10
11
12
const strRegex = '^((https|http|ftp)://)?'//(https或http或ftp):// 可有可无
  + '(([\\w_!~*\'()\\.&=+$%-]+: )?[\\w_!~*\'()\\.&=+$%-]+@)?' //ftp的user@ 可有可无
  + '(([0-9]{1,3}\\.){3}[0-9]{1,3}' // IP形式的URL- 3位数字.3位数字.3位数字.3位数字
  + '|' // 允许IP和DOMAIN(域名)
  + '(localhost)|' //匹配localhost
  + '([\\w_!~*\'()-]+\\.)*' // 域名- 至少一个[英文或数字_!~*\'()-]加上.
  + '\\w+\\.' // 一级域名 -英文或数字 加上.
  + '[a-zA-Z]{1,6})' // 顶级域名- 1-6位英文
  + '(:[0-9]{1,5})?' // 端口- :80 ,1-5位数字
  + '((/?)|' // url无参数结尾 - 斜杆或这没有
  + '(/[\\w_!~*\'()\\.;?:@&=+$,%#-]+)+/?)$';//请求参数结尾- 英文或数字和[]内的各种字符
const re = new RegExp(strRegex, 'i');
  • IPv4地址正则
1
/^(?:(?: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]?)$/;
  • 十六进制颜色正则
1
/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
  • QQ号码正则
1
qqPattern = /^[1-9][0-9]{4,12}$/;
  • 车牌号正则
1
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
  • 包含中文正则
1
2
3
/[\u4E00-\u9FA5]/;

/[一-龥]/;

正则表达式进阶

子表达式

捕获

方向引用

【参考文章】