什么是正则表达式
正则,即规则,模式,是字符串匹配及操作的强大工具。
写法
var re = new RegExp('具体规则'); // 实例化
// 或
var re = /具体规则/; // 简写
常用方法
正则.test(字符串); // 字符串判断,匹配成功返回 true,匹配失败返回 false。
字符串.search(正则); // 字符串查找,匹配成功返回所匹配到的位置,匹配失败返回 -1。
字符串.match(正则); // 获取匹配项集合,匹配成功返回数组,匹配失败返回 null。
字符串.replace(); // 替换符合匹配的,返回匹配替换后的字符串。
接下来举例说明这4个的用法。
test 的使用
用于字符串判断,匹配成功返回 true,匹配失败返回 false。
【例子】匹配项为 abc 来匹配字符串
var re = /abc/;
re.test('abcd'); // true
re.test('abdc'); // false
【例子】字符串是否全为数字
var str = '12345A67890';
/\D/.test('abcd'); // true,说明字符串不全为数字。此处利用了转义字符来判断,\D 表示非数字。
search 的使用
用于字符串查找,匹配成功返回所匹配到的位置,匹配失败返回 -1。
【例子】查找字符串 abcdefg
var str = 'abcdefg';
str.search(/c/) // 2 匹配成功,c 在第2位置上。
str.search(/C/) // -1 匹配失败,字符串不包含 C。
str.search(/C/i) // 2 匹配成功,忽略大小写时,字符串包含 c。
str.search(/gf/i) // -1 匹配失败,字符串不包含 gf。
match 的使用
用于从字符串中获取匹配项集合,匹配成功返回数组,匹配失败返回 null。
【例子】找出字符串里的数字
var str = 'a12b34c56d78';
str.match(/\d/); // [1] 由于正则默认匹配成功后就退出,所以只匹配到了1。
str.match(/\d/g); // [1,2,3,4,5,6,7,8] 全局匹配,所有的数字都匹配出来了。
str.search(/\d+/g); // [12, 34, 56, 78] “+”是量词,出现1个或多个数字是一个整体。
replace 的使用
用于替换符合匹配的,返回匹配替换后的字符串。
【例子】替换a为A
var str = 'ababaa'
str.replace(/a/, 'A'); // Ababaa 默认匹配成功后就退出,所以匹配结果为 Ababaa。
str.replace(/a/g, 'A'); // AbAbAA 将所有的 a 都替换成 A。
【例子】词语过滤
// 将 “哈”、“嘻”、“呵”替换成“*”号。
// replace 的第2个参数可以为字符串,还可以是回调函数,处理比较复杂的功能。
var str = 'a哈哈b嘻嘻c呵呵';
str.replace(/哈|嘻|呵/g, function (item) {
var res = '';
for (var i = 0; i < item.length; i++) {
res += '*';
}
return res;
});
// a**b**c
量词
量词即出现的次数。
常用的量词有:
量词 | 含义 |
---|---|
{n, m} | 至少出现n次,最多出现m次 |
{n,} | 至少出现n次,无上限 |
{n} | 正好出现n次 |
* | 任意次,即{0,} |
? | 0或1次,即{0,1} |
+ | 至少出现1次,即{1,} |
【例子】字符串判断
var str = 'ab';
/ab+/.test(str); // true + 表示 b 出现1+次,匹配。
/ac+/.test(str); // false + 表示 c 出现1+次,不匹配。
/ac*/.test(str); // true * 表示 c 可以出现0次,匹配。
正则里的[]
[]里字符间是或关系,只要1个字符符合就匹配成功。
【例子】[]里有一个字符匹配成功就成功了
/[abc]/.test('a'); // true [] 含有a
/[abc]/.test('def'); // false [] 不含d、e、f
【例子】范围
var str = 'ab';
/[a-z]/.test(str); // true [] 里既含 a 又含 b,匹配。
/[A-Z]/.test(str); // false [] 里既不含 a 又不含 b,不匹配。
/[^A-Z]/.test(str); // true []里的^表示否,所以除了A-Z外都包含,匹配。
正则首尾
使得正则匹配更加严格
符号 | 含义 |
---|---|
^ | 放在正则最开始位置代表起始 |
$ | 放在正则最后的位置代表结束 |
【例子】QQ号校验
/[1-9]\d{4,}/g.test('10000') // true 我们知道,QQ号以非0开始([1,9]),最少5位(\d{4,})
// 但该正则并不严谨,比如说:
/[1-9]\d{4,}/g.test('010000') // true
// 使用 ^ 辅助:
/^[1-9]\d{4,}/g.test('10000') // true ^ 放在正则最开始位置代表起始
/^[1-9]\d{4,}/g.test('010000') // false ^ 放在正则最开始位置代表起始,显然匹配不成功
【例子】去掉字符串首尾的空格
var str = ' hahaha ';
str.replace(/^\s+|\s+$/g, ''); // 返回得到“hahaha”
/* 释义:
^\s+ 表以1个或多个空格开始
| 或
\s+$ 表以1个或多个空格结尾
g 全局
*/
转义字符
转义字符 | 含义 |
---|---|
\b | 独立部分:起始、结束、空格 |
\B | 非独立部分 |
\d | 数字 |
\D | 非数字 |
\s | 空格 |
\S | 非空格 |
\w | 字符(数字、字母、下划线) |
\W | 非字符 |
\第i个子项 | 第i个子项的字符(串) |
【例子】“.”表示任意,“\.”才表示点
var str = 'a.c';
/a.c/.test(str); // true 正则里的“.”表示任意,包含字符串里的点“.”
/a\.c/.test(str); // true \. 表示点,即字符串里的点“.”
【例子】独不独立
var str = 'abc';
/\babc/.test(str); // true \b 处代表起始,与字符串 str 匹配
/a\bbc/.test(str); // false \b 处代表空格或结束,与字符串 str 不匹配
/a\Bbc/.test(str); // true \b 处不独立,即不是开始、结束,也不是空格,与字符串 str 匹配
【例子】\第i个子项
var str = 'abca';
/(a)(b)(c)\1/.test(str); // true \1 表第1个子项,即 a,匹配。
/(a)(b)(c)\2/.test(str); // false \2 表第2个子项,即 b,不匹配。
其他例子
【例子】日期格式转换,“-”变成“.”。
使用“匹配子项”功能,()表示子项。
var str = '2018-2-10';
var date = str.replace(/(\d+)(-)/g, function($0, $1, $2){
// $0表示匹配的整体:(\d+)(-)。即“2018-”或“2-”。
// $1为第1个子项,第1个括号里匹配到的内容。即“2018”或“2”。
// $2为第2个子项,第2个括号里匹配到的内容。即“-”或“-”。
return $1 + '.';
});
console.log(date); // 2018.2.10
【例子】常用正则
[\u4e00-\u9fa5] // 匹配中文
^\s*|\s*$ // 行首行尾空格
^\w+@[a-z0-9]+(\.[a-z]+){1,3}$ // Email
[a-zA-z]+://[^\s]* // 网址
[1-9]\d{5} // 邮政编码
[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x // 身份证