含义
正则表达式是构成搜索模式的字符序列。
每个语言都有正则表达式。
正则表达式的作用:匹配特殊字符或有特殊搭配原则的字符的最佳选择。
字符
1.\ 转义字符
强制性把 \ 后面的字符转换成文本。
<script>
var str = "cncnn\"aaaaa";
console.log(str); // "cncnn"aaaaa"
var str = "cncnn\\aaaaa";
console.log(str); // cncnn\aaaaa
</script>
// 多行字符串代码
<script>
document.body.innerHTML = "\
<div></div>\
<span></span>\
";
document.body.innerHTML =
"<div></div>" +
"<span></span>";
</script>
2.\n 字符串换行符
<script>
var str = "avd\nddd";
console.log(str); // avd
// ddd
</script>
3.\r 行节数
4. \t 表示缩进(制表符)
正则表达式修饰符
- i:执行对大小写不敏感的匹配。
<script>
// 检测str里面有没有连着的abce字符串片段
var reg = /abce/i;
var str = "ABce";
console.log(reg.test(str)); // true
</script>
- g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
<script>
// 检测str里面有没有ab字符串片段,并且返回全部
var reg = /ab/g;
var str = "abCDabABabF";
console.log(str.match(reg)); // ["ab", "ab", "ab"]
</script>
- m:执行多行匹配。
<script>
// 检测str里面有没有以a字符串开头片段
var reg = /^a/gm;
var str = "abababab\nababab";
console.log(str.match(reg)); // ["a", "a"]
</script>
正则表达式的方法
1.reg.test(); 用于检测一个字符串是否匹配某个模式。
<script>
// 检测str里面有没有连着的abce字符串片段
var reg = /abce/i;
var str = "ABce";
console.log(reg.test(str)); // true
</script>
2.str.match(); 在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
<script>
// 检测str里面有没有以a字符串开头片段
var reg = /^a/gm;
var str = "abababab\nababab";
console.log(str.match(reg)); // ["a", "a"]
</script>
3.exec() 方法检索字符串中的指定值。返回值是被找到的值,并确定其位置。如果没有发现匹配,则返回 null。
不加属性g ,reg.exec就不会动。
<script>
// 第一个参数写规则,还可以放写好的规则,第二个写属性。
var reg = new RegExp("abic", "i");
console.log(reg.exec("a")); // null
console.log(reg.exec("abiCaaaa")); // ["abiC", index: 0, input: "abiCaaaa", groups: undefined]
</script>
<script>
var reg = /(\w)\1\1\1/g;
var str = "aaaa";
console.log(str.match(reg)); // ["aaaa"]
var reg = /(\w)\1(\w)\2/g;
var str = "aacc";
console.log(str.match(reg)); // ["aacc"]
console.log(reg.exec(str)); // ["aacc", "a", "c", index: 0, input: "aacc", groups: undefined]
</script>
4. replace() 替换与正则表达式匹配的子串。
<script>
var reg = /a/g;
var str = "aa";
console.log(str.replace(reg,"b")); // bb
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.replace(reg,"$2$2$1$1")); // bbaa
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.replace(reg,function ($, $1, $2) {
return $2 + $2 + $1 + $1;
})); // bbaa
// 变大写
var str = "aabb";
console.log(str.toUpperCase(str)); // AABB
// 变小写
var str = "AABB";
console.log(str.toLowerCase()); // aabb
</script>
把第一个替换成哪个。有g就全局匹配。
正向预查,正向断言?= ?!
<script>
// 选择后面跟着b的a
var str = "abaaaa";
var reg = /a(?=b)/g;
console.log(str.match(reg)); // ["a"]
// 选择后面不是跟着b的a
var str = "abaaaa";
var reg = /a(?!b)/g;
console.log(str.match(reg)); // ["a", "a", "a", "a"]
</script>
5. compile() 方法用于改变 RegExp。既可以改变检索模式,也可以添加或删除第二个参数。
<script>
// 第一个参数写规则,还可以放写好的规则,第二个写属性。
var reg = new RegExp("abic", "i");
console.log(reg.test("a")); // false
reg.compile("d");
console.log(reg.test("abiCaadaa")); // true
</script>
6. reg.lastIndex (油标,可以手动控制) 与 reg.exec 相匹配。
lastIndex 属性用于规定下次匹配的起始位置。
上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。
正则表达式的创建方式
1.直接量 (推荐)
<script>
// 检测str里面有没有连着的abc字符串片段
var reg = /abc/;
var str = "abcd";
console.log(reg.test(str)); // true
// 检测str里面有没有连着的abce字符串片段
var reg = /abce/;
var str = "abcd";
console.log(reg.test(str)); // false
</script>
2.new RegExp();
<script>
// 第一个参数写规则,还可以放写好的规则,第二个写属性。
var reg = new RegExp("abic");
console.log(reg.test("a")); // false
console.log(reg.test("abicaaaa")); // true
</script>
正则表达式模式
表达式
1.[abc] 查找方括号之间的任何字符。
<script>
var reg = /[abc][abc][abc]/g;
var str = "12333abcafa3333babCa1a222ba3";
console.log(str.match(reg)); // ["abc", "bab"]
</script>
- [a-z] 查找任何从小写 a 到小写 z 的字符。
<script>
var reg = /[a-z][a-z]/g;
var str = "12333aABcaab";
console.log(str.match(reg)); // ["ca", "ab"]
</script>
- [A-Z] 查找任何从大写 A 到大写 Z 的字符。
<script>
var reg = /[A-Z][A-Z]/g;
var str = "12333aABcaab";
console.log(str.match(reg)); // ["AB"]
</script>
- [A-z] 查找任何从大写 A 到小写 z 的字符。
<script>
var reg = /[A-z][A-z]/g;
var str = "12333aABcaab";
console.log(str.match(reg)); // ["aA", "Bc", "aa"]
</script>
- [^abc] 查找任何不在方括号之间的字符。
<script>
var reg = /[^abc][^abc]/g;
var str = "12333aABcaab";
console.log(str.match(reg)); // ["12", "33", "AB"]
</script>
2.[0-9] 查找任何从 0 至 9 的数字。
<script>
var reg = /[1234567890][1234567890][1234567890]/g;
var str = "12333abcafa3333babCa1a222ba3";
console.log(str.match(reg)); // ["123", "333", "222"]
var reg = /[0-9][0-9][0-9]/g;
var str = "12333abcafa3333babCa1a222ba3";
console.log(str.match(reg)); // ["123", "333", "222"]
</script>
3.(x|y) 查找由 | 分隔的任何选项。
<script>
// 对任何指定的备选项进行全局搜索(AB|ab)
var reg = /(AB|ab)/g;
var str = "12333aABcaab";
console.log(str.match(reg)); // ["AB", "ab"]
</script>
元字符(是拥有特殊含义的字符)
1.\d 查找数字。
<script>
// 匹配 [0-9]2a
var reg = /\d2a/g;
var str = "122a3332a";
console.log(str.match(reg)); // ["22a", "32a"]
</script>
- \D 查找非数字字符
<script>
// 匹配 (非[0-9])2a
var reg = /\D2a/g;
var str = "122a333A2a";
console.log(str.match(reg)); // ["A2a"]
</script>
2.\s 查找空白字符。空格符 制表符\t 回车符\r 换行符\n 垂直换行符\v 换页符\f
<script>
// 匹配 (空白字符)2a
var reg = /\s2a/g;
var str = "122\na33\v3A\n2a";
console.log(str.match(reg)); // ["↵2a"]
</script>
- \S 查找非空白字符。
<script>
// 匹配 (非空白字符)2a
var reg = /\S2a/g;
var str = "122a33\v3A\n2a";
console.log(str.match(reg)); // ["22a"]
</script>
3.\b 匹配单词边界。
<script>
// 单词的开头或结尾处对“2a”进行全局搜索。
var reg = /\b2a/g;
var str = "2a122a32a 2a3\v3A\n2a";
console.log(str.match(reg)); // ["2a", "2a", "2a"]
</script>
- \B 匹配非单词边界。
<script>
// 单词的非开头或结尾处,对“2a”进行全局搜索。
var reg = /\B2a/g;
var str = "122a32a 2a3\v3A\n";
console.log(str.match(reg)); // ["2a", "2a"]
</script>
4.\w 查找单词字符。[0-9A-z_]
<script>
// 对“[0-9A-z_]2a”进行全局搜索。
var reg = /\w2a/g;
var str = "12_2a32a 2a3\v3A\n2a";
console.log(str.match(reg)); // ["_2a", "32a"]
</script>
- \W 查找非单词字符。
<script>
// 对“(非[0-9A-z_])2a”进行全局搜索。
var reg = /\W2a/g;
var str = "12_2a32a 2a3\v3A\n2a";
console.log(str.match(reg)); // [" 2a", "↵2a"]
</script>
5.\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
<script>
// 全局搜索字符串中的十六进制数0057(W)。
var reg = /\u0057/g;
var str = "12_2a3wW2a W2a3\v3A\n2a";
console.log(str.match(reg)); // ["W", "W"]
</script>
6. .查找单个字符,除了换行和行结束符。[^\n\r]
<script>
// 全局搜索字符串中的"[^\n\r]2a"。
var reg = /.2a/g;
var str = "12_2a3wW2a W2a3\v3A\n2a";
console.log(str.match(reg)); // ["_2a", "W2a", "W2a"]
</script>
量词
1.n+ 匹配任何包含至少一个 n 的字符串。
<script>
// 匹配任何包含至少一个 A 的字符串。
var reg = /A+/g;
var str = "12_2a3wW2a W2a3\v3A\n2a AA";
console.log(str.match(reg)); // ["A", "AA"]
</script>
2. n* 匹配任何包含零个或多个 n 的字符串。
<script>
// 匹配任何包含零个或多个 A 的字符串。
var reg = /A*/g;
var str = " A\n 2a AA";
console.log(str.match(reg)); // (9) ["", "A", "", "", "", "", "", "AA", ""]
</script>
3. n? 匹配任何包含零个或一个 n 的字符串。
<script>
// 匹配任何包含零个或一个 A 的字符串。
var reg = /A?/g;
var str = " A\n 2a AA";
console.log(str.match(reg)); // (10) ["", "A", "", "", "", "", "", "A", "A", ""]
</script>
4. n{X} 匹配 X 个序列的n字符串。
<script>
// 匹配 3 个序列的A字符串。
var reg = /A{3}/g;
var str = " AAA\n 2a AAAA";
console.log(str.match(reg)); // ["AAA", "AAA"]
</script>
5. n{X,Y} 匹配 X 至 Y 个序列的n字符串。
<script>
// 匹配 3 至 5 个序列的 A 字符串。
var reg = /A{3,5}/g;
var str = " AAA\n AAAAAA 2a AAAA";
console.log(str.match(reg)); // ["AAA", "AAAAA", "AAAA"]
</script>
6. n{X,} 匹配至少 X 个序列的n字符串。
<script>
// 匹配至少 3 个序列的 A 字符串。
var reg = /A{3,}/g;
var str = " AAA\n AAAAAA 2a AAAA";
console.log(str.match(reg)); // ["AAA", "AAAAAA", "AAAA"]
</script>
7. n$ 匹配结尾n字符串。
<script>
// 匹配结尾为 A 字符串。
var reg = /A$/g;
var str = " AAA\n AAAAAA 2a AAAA";
console.log(str.match(reg)); // ["A"]
</script>
8. ^n 匹配开头n字符串。
<script>
// 匹配开头为 A 字符串。
var reg = /^A/g;
var str = "AAA\n AAAAAA 2a AAAA";
console.log(str.match(reg)); // ["A"]
</script>
练习
- 写一个正则表达式,检验一个字符串首尾(首或尾)是否含有数字。
<script>
// 写一个正则表达式,检验一个字符串首尾是否含有数字。
var reg = /^\d|\d$/g;
var str = "123AAA\n AAAAAA 2a AAAA 333";
console.log(str.match(reg)); // ["1", "3"]
</script>
- 练习:打后面往前查,每三个打一个点。
<script>
// 练习:打后面往前查,每三个打一个点。
var reg = /(?=(\B)(\d{3})+$)/g;
var str = "100000";
console.log(str.replace(reg, ".")); // ["1", "3"]
</script>
- the-first-name 变成小驼峰式
<script>
var reg = /-(\w)/g;
var str = "the-first-name";
console.log(str.replace(reg,function ($, $1) {
return $1.toUpperCase();
})); // theFirstName
</script>