对于正则表达式,不仅可以在JavaScript中使用,在其它语言中同样提供,正则表达式是和语言无关的。什么是正则表达式呢?正则表达式是用于匹配字符串规则的表达式,这个表达式也是用字符串表示,正则表达式主要是处理字符串,它是对字符串操作的一种逻辑运算,使用预定的特殊字符及其组合匹配字符串中的相关字符。
正则表达式有什么用?主要用途有三个方面:检查字符串是否符合正则表达式的某一个规则,例如检查邮箱地址或者手机号码是否符合规则,或者检查密码是否足够复杂。第二个用处就是使用正则表达式从字符串中提取我们想要的部分,例如爬虫,从网上爬取网页数据,可以使用正则表达式从中提取出所有URL。第三个用于就是使用正则表达式匹配指定的字符串,并将符合匹配的部分进行替换操作。
一、正则表达式的书写规则
1、正则表达式的基本运算和语法
上面提到,正则表达式是脱离语言而存在的,准确来说,正则表达式有它自己的基本运算规则,这个运算规则可以帮助我们准确理解和使用正则表达式。正则表达式有三种基本运算规则:连接运算、并运算和闭包运算,假设M和N是两个正则表达式:
MN表示连接运算,M和N前后相连,例如AB,匹配目标字符串中的{AB}部分。
M|N表示并运算,M和N组成一个集合,目标字符串中有M或N的部分都会匹配到。
M*或M+表示闭包运算,表示连续匹配M,例如A+表示A至少重复匹配1次。
2、正则表达式的元字符
以下提到的元字符和限定符都是正则表达式的语法糖,也就是说很多都是一种简要的写法,但是写法都是基于上面提到的正则表达式的基本运算,元字符是用来代表某一种字符的,例如\d表示所有数字,但是利用上面的规则也可以写成[0-9]的形式,常见的正则表达式元字符有:
元字符 | 描述 |
\d | 匹配数字 |
\D | 匹配任意非数字 |
\w | 匹配字母、数字或下划线 |
\W | 匹配任意非字母、数字和下划线 |
\s | 匹配任意空白字符 |
\S | 匹配任意非空白字符 |
.(点) | 匹配出换行符以外的单个字符 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
[a-z] | 字符集合,匹配26个字母 |
[^] | 匹配除中括号以外的内容 |
(pattern) | 小括号可以自定匹配确定的模式 |
\. | 转义字符,匹配点 |
3、正则表达式和限定符
限定符主要是正则表达式闭包运算的语法糖,常见的限定符有:
限定符 | 描述 |
* | 重复匹配0次或多次,等价于{0,} |
+ | 重复匹配1次或多次,等价于{1,} |
? | 重复匹配0次或1次,等价于{0,1} |
{n} | 匹配确定的n次 |
{n,} | 至少匹配n次 |
{n,m} | 匹配n到m次,n<m |
二、JS使用正则表达式之RegExp对象
使用RegExp对象进行正则表达式匹配的方式有两种:test()方法和exec()方法,test方法用于检测目标字符串中是否存在相应的匹配,返回true或false,exec方法用于查找匹配的字符串,返回一个数组,数组元素为匹配到的字符串。
创建RegExp对象的方式有两种:
// 创建EegExp对象方式一,第一个参数是表达式,第二个是模式
var reg = new RegExp("\\d*", "gi");
// 方式二:使用/ /包住正则表达式,结尾是模式
var exp = /\d+/g;
其中gi为匹配模式,表示忽略大小写全局匹配,可取值如下:
标志 | 描述 |
i | 忽略大小写 |
g | 全局匹配 |
m | 多行匹配 |
其中new RegExp中要注意\d需要转义写成\\d,正则表达式对象的属性有:
属性名 | 描述 |
global | Boolean,是否全局匹配 |
IgnoreCase | 是否忽略字符大小写 |
LastIndex | 下次匹配的字符串索引位置 |
Multiline | 是否多行匹配 |
Source | 正则表达式字符串 |
RegExp对象的exec方法使用说明:该方法会首先执行一次搜索匹配,返回一个数组或null,执行完一次则自动设置对象的lastIndex属性。对于返回的数组对象,第一个元素是匹配到的字符串,index表示匹配到的以0开始的索引值,input为原来的字符串,exec方式和test方式使用实例如下:
var exp = /[\d]+/g;
var str = "Sd4wOPD8sd1f25sd1f";
var array;
// 使用test函数检测字符串中是否有匹配的字符串
var hasPattern = exp.test(str); // 返回true
console.log(hasPattern);
while(array = exp.exec(str)){
console.log(array[0]);
}
// 输出:8 1 25 1
三、JS使用正则表达式之String字符串对象
使用String方法进行正则匹配也是常用的方式,String中提供正则匹配的方法有:match函数、search函数、replace函数和split函数,这些方式的用法描述如下:
方法/函数 | 描述 |
Match | 查找匹配的对象,返回数组或null |
Search | 测试匹配,返回匹配的索引或-1 |
Replace | 查找匹配,并进行替换 |
Split | 匹配分隔字符串,返回数组 |
使用实例如下:
var string = "bbc radio 4 vue2 react7";
var rep = /[\w\d]+/gi;
// 使用serach检测字符串中是否有匹配的字符串模式
var hasPtn = string.search(rep);
console.log(hasPtn); // => 0,匹配到的一个字符串的索引
// 使用match匹配字符串
var array = string.match(rep);
console.log(array); // bbc radio vue react
// 使用replace替换字符串
var newStr = string.replace(/[a-z]+\d/gi, "extra"); // 将字符串接数字的字符串替换
console.log(newStr); // bbc radio 4 extra extra
// 使用split分割字符串
var newArray = string.split(/[\s]+/); // 使用空白符分隔字符串
console.log(newArray); // "bbc", "radio", "4", "vue2", "react7"