正则表达式在很多编程语言中都是一个很重要的概念,JavaScript通过RegExp类型来支持正则表达式。
一、正则表达式模式
下面列举一些使用频率较高的匹配模式:
量词
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
大括号
大括号 | 描述 |
---|---|
{n} | 精确匹配n次 |
{n,} | 匹配n次以上 |
{n,m} | 匹配n-m次 |
中括号
中括号 | 描述 |
---|---|
[xyz] | 匹配这个集合中的任一一个字符(或元字符) |
[^xyz] | 不匹配这个集合中的任何一个字符 |
小括号
小括号 | 描述 |
---|---|
(x) | 匹配x保存x在名为$1…$9的变量中(捕获组) |
小括号用来对匹配规则分组,类似于数学中的()。
元字符
元字符 | 描述 |
---|---|
\d | 查找数字 /\d/ = /[0-9]/ |
\s | 查找空白字符 |
转义字符
\ 做为转意,即通常在"\“后面的字符不按原来意义解释,如/b/匹配字符"b”,当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。
二、正则表达式修饰符
通常来说,模式+修饰符构成一个完整的正则表达式。JavaScript中的修饰符有以下三种:
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配。case-insensitive |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。global |
m | 执行多行匹配。multiline |
三、创建正则表达式
在JavaScript当中,创建一个正则表达式有两种方式:使用字面量形式来创建;使用RegExp构造函数来创建。
例如:
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
* 与pattern1 相同,只不过是使用构造函数创建的
*/
var pattern2 = new RegExp("[bc]at", "i");
四、使用正则表达式
使用test()
它接受一个字符串参数。在模式与该参数匹配的情况下返回true;否则,返回false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便。
例如:
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){
alert("The pattern was matched.");
}
使用exec()
该方法是RegExp对象的主要方法,该方法是专门为捕获组而设计的。exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。
例如:
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); // 0
alert(matches.input); // "mom and dad and baby"
alert(matches[0]); // "mom and dad and baby"
alert(matches[1]); // " and dad and baby"
alert(matches[2]); // " and baby"
五、例题(阿里巴巴2017秋招前端笔试题)
单选题
正则表达式 /a+(bab)?(caac)/ ,下列选项中是该正则表达式的子集是?
A. /(bab)(caca)/
B. /a(bab){2}(caac)/
C. /a{2}/
D. /a+(bab){0,1}(ca)+(ca)/
E. /a(^bab)+(caac){1,}/
F. /a+(babc){2,}(acc){1,}/
解析:
A选项 babcaca不是子集
B选项 ababbab不是子集
C选项 aa是子集
D选项 acaca不是子集
E选项 正则本身有误,(^bab)匹配以"bab"开头的字符串,但前面还有a,也就是匹配以a开头的字符串,两者矛盾。
F选项 ababcbabcacc明显不是子集
所以答案选C。