各位小可爱们,你们的柳猫又双叒叕回来啦~今天给大家分享的是JavaScript中最为娇小的王者:正则匹配。
首先我们来康康什么是正则匹配:
正则表达式(regular expression)是一个描述字符模式的对象。使用正则表达式可以进行强大的模式匹配和文本检索与替换功能。
一、创建正则表达式
创建正则表达式和创建字符串相似,创建正则表达式提供了两种方法,一种采用new运算符,另一种采用字面量方式。
var box = new RegExp('box'); //第一个参数字符串
var box = new RegExp('box','ig'); //第二个参数可选模式修饰符
参数 | 含义 |
---|---|
i | 忽略大小写 |
g | 全局匹配 |
m | 多行匹配 |
var box = /Box/; //使用字面量方式的正则
var box = /Box/ig; //第二个斜杠后加模式修饰符
二、测试正则表达式
-
RegExp对象包含两个常用方法:test()和exec(),功能基本相似,用于测试字符串匹配。
-
test()方法在字符串中查找是否存在指定的正则表达式,并返回布尔值,如果存在则返回true,否则返回false。
-
exec()方法也用于在字符串中查找指定正则表达式,如果exec()执行成功,则返回包含该查找字符串的相关信息数据,否则返回null。(返回结果数组)
var pattern = new RegExp('Box','i');
var str = 'box';
alert(pattern.test(str)); //true
var pattern = /Box/i;
var str = 'box';
alert(pattern.test(str)); //true
var pattern = /Box/i;
var str = 'This is a box';
alert(pattern.test(str)); //true
var pattern = /Box/i;
var str = 'box';
alert(pattern.exec(str)); //box返回的是数组,有就返回数组的值,没有匹配到就返回null
var str ='ss';
alert(pattern.exec(str)); //没有匹配到返回null
三、使用字符串的正则表达式方法
string对象也提供了4个使用正则表达式的方法
方法 | 含义 |
---|---|
match(pattern) | 在一个字符串中寻找一个与正则表达式模式(pattern)的匹配/返回pattern中的字串或者null |
replace(pattern,replacement) | 用replacement替换pattern |
search(pattern) | 返回与正则表达式(pattern)的匹配 |
split(pattern) | 返回字符串按指定pattern拆分的数组 |
var pattern = /Box/ig; //开启全局
var str = 'This is a Box';
alert(str.match(pattern)); //匹配所有
var pattern = /box/ig;
var str = 'This is a box! That is a Box too!';
alert(str.replace(pattern,'supperman'));
//This is a supperman! That is a supperman too';
var pattern= /!/ig;
alert(str.split(pattern)); //This is a supperman!, That is a supperman too !,
RegExp对象的属性
属性 | 意义 |
---|---|
$1(到$9) | 圆括号包围的字符串匹配 |
$_ | 相当于input |
$* | 相当于multiline |
$& | 相当于lastMatch |
$+ | 相当于lastParen |
$` | 相当于leftContext |
$’ | 相当于rightContext |
constructor | 指定创建对象原型的函数 |
global | 全局搜索(使用g修饰符) |
ignoreCase | 不区分大小写搜索(使用i修饰符) |
input | 如果没有传递字符串,这就是要搜索的字符串 |
lastIndex | 继续匹配的起始位置 |
lastMatch | 最后一个匹配的字符串 |
lastParen | 最后的圆括号包围的子字符串匹配 |
leftContext | 最近一个匹配字符串左边的子字符串 |
multiline | 是否跨多行搜索字符串 |
prototype | 允许在所有对象中添加属性 |
rightContext | 最近一个匹配字符串右边的子字符串 |
source | 正则表达式模式本身 |
JavaScript | 元字符 |
正则表达式元字符是包含特殊含义的字符,他们有一些功能,可以控制匹配模式的方式,反斜杠后的元字符将失去其特殊含义。
在字面意义和特殊意义之间进行切换。例如w表示w的特殊意义而不是字面值w,但是KaTeX parse error: Expected 'EOF', got '表' at position 1: 表̲示不使用的特殊意义而是使用$字符本身。
元字符/元符号 | 匹配\ |
---|---|
^ | 字符串的开头 |
$ | 字符串的结尾 |
* | 零次或者多次 |
+ | 一次或者多次 |
? | 零次或者一次 |
. | 除换行符外的任何字符 |
\b | 单词边界 |
\B | 非单词边界 |
\d | 0-9的任何数字(与[0-9]相同) |
D | 任何非数字 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\s | 任何一个空白字符(与[fnrtv]相同) |
\S | 任何一个非空白字符 |
\t | 制表符 |
\v | 垂直制表符 |
\w | 任何字母、数字以及下划线(与[a-zA-Z0-9_]相同) |
\W | 除数字、字母及下划线外的其他字符 |
\xnn | 十六进制数字nn定义的ASCII字符 |
\onn | 八进制数字nn定义的ASCII字符 |
\cX | 控制字符X |
[abcde] | 与其中任何字符匹配的字符串 |
[^abcde] | 字符补集,与其中任何字符都不匹配的字符集 |
[a-e] | 与其中的字符范围匹配的字符集 |
[\b] | 退格字符的字面量意义(不同于b) |
{n} | 前面的字符正好出现n次 |
{n,} | 前面的字符至少出现n次 |
{m,n} | 前面的字符至少出现m次,最多n次 |
() | 一个组,可以在后面引用它 |
x | y |
o+ | 表示1个或者多个o |
x? | 表示0个或者1个x |
x* | 表示0个或者多个x |
(xyz)+ | 匹配至少一个(xyz) |
x{m,n} | 匹配至少m个,最多n个x |
四、15个Js正则匹配常用案例
看完这么多基本的正则表达式规则,相信有许多小可爱和柳猫一样头疼,这么多规则到底该怎么用呢?接下来,跟柳猫一起康康~
在表单验证中,使用正则表达式来验证正确与否是一个很频繁的操作,下面柳猫将分享15个常用的javaScript正则表达式,其中包括用户名、密码强度、整数、数字、电子邮件地址(Email、手机号码、身份证号、URL地址、 IPv4地址、 十六进制颜色、 日期、 QQ号码、 微信号、车牌号、中文正则。
1 用户名正则
//用户名正则,4到16位(字母,数字,下划线,减号)
var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;
//输出 true
console.log(uPattern.test("caibaojian"));
2 密码强度正则
//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
//输出 true
console.log("=="+pPattern.test("caibaojian#"));
3 整数正则
//正整数正则
var posPattern = /^\d+$/;
//负整数正则
var negPattern = /^-\d+$/;
//整数正则
var intPattern = /^-?\d+$/;
//输出 true
console.log(posPattern.test("42"));
//输出 true
console.log(negPattern.test("-42"));
//输出 true
console.log(intPattern.test("-42"));
4 数字正则
//可以是整数也可以是浮点数
//正数正则
var posPattern = /^\d*\.?\d+$/;
//负数正则
var negPattern = /^-\d*\.?\d+$/;
//数字正则
var numPattern = /^-?\d*\.?\d+$/;
console.log(posPattern.test("42.2"));
console.log(negPattern.test("-42.2"));
console.log(numPattern.test("-42.2"));
5 Email正则
//Email正则
var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
//输出 true
console.log(ePattern.test("99154507@qq.com"));
6 手机号码正则
//手机号正则
var mPattern = /^1[34578]\d{9}$/; //http://caibaojian.com/regexp-example.html
//输出 true
console.log(mPattern.test("15507621888"));
7 身份证号正则
//身份证号(18位)正则
var cP = /^[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]$/;
//输出 true
console.log(cP.test("11010519880605371X"));
8 URL正则
//URL正则
var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
//输出 true
console.log(urlP.test("http://caibaojian.com"));
9 IPv4地址正则
//ipv4地址正则
var ipP = /^(?:(?: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]?)$/;
//输出 true
console.log(ipP.test("115.28.47.26"));
10 十六进制颜色正则
//RGB Hex颜色正则
var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
//输出 true
console.log(cPattern.test("#b8b8b8"));
11 日期正则
//日期正则,简单判定,未做月份及日期的判定
var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;
//输出 true
console.log(dP1.test("2017-05-11"));
//输出 true
console.log(dP1.test("2017-15-11"));
//日期正则,复杂判定
var dP2 = /^(?:(?!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)$/;
//输出 true
console.log(dP2.test("2017-02-11"));
//输出 false
console.log(dP2.test("2017-15-11"));
//输出 false
console.log(dP2.test("2017-02-29"));
12 QQ号码正则
//QQ号正则,5至11位
var qqPattern = /^[1-9][0-9]{4,10}$/;
//输出 true
console.log(qqPattern.test("65974040"));
13 微信号正则
//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;
//输出 true
console.log(wxPattern.test("caibaojian_com"));
14 车牌号正则
//车牌号正则
var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
//输出 true
console.log(cPattern.test("粤B39006"));
15 包含中文正则
//包含中文正则
var cnPattern = /[\u4E00-\u9FA5]/;
//输出 true
console.log(cnPattern.test("蔡宝坚"));
看到最后,希望大家都能有所收获,一时半会儿肯定难以完全消化,但只要多多练习使用,相信不久各位小可爱们都能把这些规则如臂指使。
来源:oschina
链接:https://my.oschina.net/u/4303238/blog/4291082