正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
创建方式:
- 通过RegExp对象创建正则:
var reg = new RegExp(/123/);
- 通过字面量创建正则:
var reg = /123/; //这里没有引号
测试正则(.test()
):
用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
var reg = /abc/;
var str = "abcabc";
console.log(reg.test(str)); //true
匹配正则(.match()
):
可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
var reg = /abc/;
var str = "abccad";
console.log(str.match(reg)); //["abc", index: 0, input: "abccad", groups: undefined]
正则替换(.replace()
):在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。该方法不会改变原字符串。
var reg = /abc/;
var str = "abcabcde";
console.log(str.replace(reg, "12")); //12abcde
正则表达式的属性(也称修饰符):
修饰符 | 描述 |
---|---|
i | ignoreCase,执行对大小写不敏感的匹配。 |
g | global,执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | multiline,执行多行匹配。 |
var reg = /qwe/gi; //表示不区分大小写,并且全局搜索
var str = "QwEqweDQWE";
console.log(str.match(reg)); // ["QwE", "qwe", "QWE"]
方括号:方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
(x|y) | 查找任何以 | 分隔的选项。注意 | 前后不要乱加空格,空格也是规则 |
一个中括号只代表一位,中括号里边的内容代表的是这一位可以取值的范围
var reg = /[0-9][2-9][4-9]/g;
var str = "124ad54ad211ad456";
console.log(str.match(reg)); //["124", "456"]
插入符 ^
放到 [ ] 里边表示“非”的意思:
var reg = /[^1][^a]/g;
var str = "123qwe4g";
console.log(str.match(reg));//["23", "qw", "e4"]
在圆括号里可以加入"|“表示"或"的意思,”|"操作符两边放匹配规则
var reg = /(a|b)[^1][a-z]/g;
var str = "a2a12a4r";
console.log(str.match(reg));//["a2a", "a4r"]
元字符: 元字符是拥有特殊含义的字符,元字符也可以组合放进中括号里去使用,一个元字符代表一位
元字符 | 描述 |
---|---|
\w | 查找单词字符(字母+数字+下划线), [0-9A-z] |
\W | 查找非单词字符 |
\d | 查找数字,[0-9] |
\D | 查找非数字字符 |
\s | 查找空白字符,包括空格符[ ]、制表符\t、回车符\r、换行符\n、垂直换行符\v、换页符\f |
\S | 查找非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\t | 查找制表符 |
\n | 查找换行符 |
\f | 查找换页符 |
\v | 查找垂直制表符 |
\uXXXX | 查找以十六进制规定的Unicode字符,\u4e00~\u9fa5 |
. | (点号)查找单个字符,除了换行和行结束符 |
量词:代表数量的词(下面表达式的n代表的是一个匹配规则,n后边符号的符号定义量词规则)。
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。1~多 |
n* | 匹配任何包含零个或多个 n 的字符串。 0~多 |
n? | 匹配任何包含零个或一个 n 的字符串。 0~1 |
n{X} | 匹配包含X 个n 的序列的字符串。刚好是X次 |
n{X, Y} | 匹配任何包含X 个至Y 个n 的序列的字符串。x~y |
n{X, } | 匹配包含至少X 个n 的序列的字符串。x~多 |
n$ | 匹配任何结尾为n 的字符串 |
^n | 匹配任何开头为n 的字符串 |
S(?=n) | 匹配任何其后紧接指定字符串n 的字符串S |
S(?!n) | 匹配任何其后没有紧接指定字符串n 的字符串S |
我们可以利用它们做一个简单的邮箱验证:
var reg = /^[0-9]\d{4,9}@(qq|163)\.(cn|com)$/;
var email1 = "2456777@qq.com";
var email2 = "24567779999999@qq.com";
var email3 = "2456777@163.cn";
var email4 = "2456777@163.con";
console.log(reg.test(email1)); //true
console.log(reg.test(email2)); //false
console.log(reg.test(email3)); //true
console.log(reg.test(email4)); //false
这里补充一个正则方法,可以分割成字符串数组split()
。
我们写一个去除运算符的正则表达式:
var reg = /(\+|\-|\*|\/|%)/;
var str = "8+3-2*40/20%10";
console.log(str.split(reg)); //["8", "3", "2", "40", "20", "10"]
再写一个例子,关于去除字符串中间的空格:
function clearMid(str) {
var reg = /(\w+)\s+(\w)/;
return str.replace(reg, "$1$2");
}
var str = " hello world ";
console.log(clearMid(str)); // " helloworld "
这里用到了交换字符串的概念,详情请看文档介绍replace()
方法的第二个参数MDN
基本的正则就是这些了。
接下来我们深入了解一下正则,这里会涉及到一个知识关于正则的引擎和回溯
我们来写一个例子:
/*
1.\d这里指的是以一个数字开头
2.?=代表先行断言,预判断,它不会匹配到。
3.\b代表单词边界
第一次找的是7,+代表一次,代表以2个数字结束
第二次找的是5,+代表二次,此时以4个数字结束
第三次找的是3,+代表三次,此时以6个字符结束
...
*/
let reg = /(\d)(?=(\d{2})+\b)/g;
let str = "0123456789";
//只能匹配一个数字哟
console.log(str.match(reg));//["1","3","5","7"]
let res = str.replace(reg, "$1,");
//相当于 0[1,]2[3,]4[5,]6[7,]89
console.log(res); //结果 01,23,45,67,89
建议大家对着文档去理解这个正则 断言。