正则表达式(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。而在网站开发中,正则表达式可以说也是经常会用到,例如用户注册时,为了确保用户输入的用户名和密码符合要求,就需要用正则表达式来匹配验证。而在用户发布文章或评论时,也需要用正则表达式来过滤一些铭感词或不文明词。

因为正则表达式比较复杂,一篇博客也很难说清楚,所以这里主要写的还是 JavaScript 使用正则表达式的一些函数和方法。

RegExp 写法

在 JavaScript 中,正则表达式需要用两个斜杠包裹,也就是把正则表达式写在两个斜杠的中间,下面是一个匹配 baidu 的正则表达式:

var re = /baidu/;

上面的写法其实是一种简写,还有一种完整的写法如下,同样是匹配 baidu

var re = new RegExp('baidu');

正则表达式是区分大小写的,如果要在匹配时忽略大小写就需要用到修饰符,例如我要匹配一个不区分大小写的 a

var re = /a/i;

后面的 i 就是修饰符,下面是一些修饰符说明:

修饰符说明
i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m执行多行匹配。

RegExp 的第二个参数就是写修饰符的,下面还是一个不区分大小写的匹配 a

var re = new RegExp('a', 'i');

RegExp 方法

下面是一些 RegExp 的方法:

test() 方法 检索字符串中指定的值,传入要检索的字符,返回 truefalse,下面是代码演示:

var str = '404 not found'; //  字符串
var re = /404/;  //  匹配404
var result = re.test(str);  //  检索str的内容
console.log(result);  //  在控制台输出结果

最终在控制台输出的结果为 true

exec 方法 检索字符串中指定的值。返回找到的值,并确定其位置。下面是代码演示:

var str = '中国移动10086'; //  字符串
var re = /\d/;  //  匹配数字
var result = re.exec(str);
console.log(result);  //  在控制台输出结果

上面的代码是匹配数字,非全局匹配,输出结果:

[
    1,
    index: 4,
    input: "中国移动10086"
]

上面输出了匹配到的第一个数字、位置、匹配的字符串,如果使用全局匹配,也就是加 g 修饰符的话,每次调用后位置都会 +1,下面是代码:

var str = '中国移动10086'; //  字符串
var re = /\d/g;  //  匹配数字
var result = [];  //  用来保存结果

//  当结果为null时就会停止循环,因为如果exec匹配失败就会返回null
while (result != null) {
    result = re.exec(str);  //  执行匹配
    if (result != null) {  //  如果匹配成功
        console.log(result); //  在控制台输出结果
    }
}

输出结果:

[
    1,
    index: 4,
    input: "中国移动10086"
]
[
    0,
    index: 5,
    input: "中国移动10086"
]
[
    0,
    index: 6,
    input: "中国移动10086"
]
[
    8,
    index: 7,
    input: "中国移动10086"
]
[
    6,
    index: 8,
    input: "中国移动10086"
]

上面输出了 5 个数组,分别是10086 的匹配结果,每次匹配位置都会往后增加。

string 方法

下面是一些支持正则表达式的 String 方法:

search() 方法 检索字符串中指定的子字符串, 或检索与正则表达式相匹配的子字符串,返回匹配成功的第一个字符的位置,下面是代码:

var str = '中国移动10086'; //  字符串
var re = /\d/;  //  匹配数字
var result = str.search(re);
console.log(result);  //  在控制台输出结果

控制台输出的结果为 4,也就是第一个数字的位置,search 方法不支持正则表达式的 g 修饰符,无论调用多少次输出的结果都是一样的。

match() 方法 在字符串内检索指定的值, 或找到一个或多个正则表达式的匹配,匹配成功会返回一个数组,否则返回 null。下面还是匹配数字的代码:

var str = '中国移动10086'; //  字符串
var re = /\d/;  //  匹配数字
var result = str.match(re);
console.log(result);  //  在控制台输出结果

这里没有使用 g 修饰符,下面是输出的结果:

[
    1,
    index: 4,
    input: "中国移动10086"
]

输出的结果和 exec 方法的差不多,包括匹配到的第 1 个字符、第 1 个字符的位置、匹配的字符串,下面是使用全局匹配的结果:

[
    1,
    0,
    0,
    8,
    6
]

加入 g 修饰符后输出了匹配到的所有字符。

replace() 方法 在字符串中用一些字符替换另一些字符, 或替换一个与正则表达式匹配的子串,返回替换后的字符串。下面是代码:

var str = '中国移动10086'; //  字符串
var re = /\d/;  //  匹配数字
var result = str.replace(re, '*');  //  替换
console.log(result);  //  在控制台输出结果

这里把数字替换为*,因为没有使用全局匹配,所以只会替换第1个数字,输出的结果为:中国移动*0086,如果加入 g 修饰符的话,替换后输出的结果为:中国移动*****

split() 方法 把一个字符串分割成字符串数组,参数为分隔符字符或正则表达式,第二个参数为数组长度,可省略。下面是代码:

var str = 'java1PHP2Python3C#'; //  字符串
var re = /\d/g;  //  匹配数字
var result = str.split(re);  //  拆分
console.log(result);  //  在控制台输出结果

上面的代码是用数字作为分隔符,下面是结果:

[
    "java",
    "PHP",
    "Python",
    "C#"
]

上面就是 JavaScript 中经常会用到的一些正则表达式的方法。