两种创建方式
● 直接量
var reg = /abc/i; // i 忽略大小写 g 全局匹配 m 多行匹配
var str = "abcd"
console.log(reg.test(str)) // true
reg.test() // 判断有没有符合要求的片段 返回true/false
str.match(reg) // 匹配符合要求的片段 返回数组
// g 全局匹配
var reg = /ab/;
var str = "abababababab";
console.log(str.match(reg)) // ["ab"]
var reg = /ab/g;
console.log(str.match(reg)) // ["ab", "ab", "ab", "ab", "ab", "ab"]
// m 多行匹配
var reg = /a/g;
var str = "abcda";
console.log(str.match(reg)) // ["a", "a"]
var reg = /^a/g; // ^ 以a开头的a
console.log(str.match(reg)) // ["a"]
var reg = /a/gm;
var str = "abcd\na";
console.log(str.match(reg)) // ["a", "a"]
● new RegExp()
var reg = new RegExp("abc", "i")
var str = "abcd"
console.log(reg.test(str)) // true
表达式
var reg = /[ab][cd][d]/g;
// var reg = /[0-9A-z][cd][d]/g;
// var reg = /[^a][^b]/g; // ^在表达式里表示非
// var reg = /(abc|bcd)/g; // |表示或
var str = "abcd";
console.log(str.match(reg)) // ["bcd"]
元字符
// \w === [0-9A-z_]
// \W === [^w]
var reg = /\wcd/g;
var str = "abc";
console.log(str.match(reg)); // ["bcd"]
// \d === [0-9]
// \D === [^\d]
var reg = /\d\d\d/g;
var str = "123";
console.log(str.match(reg)); // ["123"]
var reg = /\w\d/g;
var str = "s";
console.log(str.match(reg)); // ["s"]
// \s === [\t\r\n\v\f] 包含 空格符、\t(制表符)、\r(回车符)、\n(换行符)、\v(垂直换行符)、\f(换页符)
// \S === [^\s]
var reg = /\tc/g;
var str = "abc\tcdefgh";
console.log(str.match(reg)); // [" c"]
// \b === 单词边界
// \B === 非单词边界
var reg = /\bcde/g;
var str = "abc cde fgh";
// var reg = /\bcde\B/g;
// var str = "abc cdefgh";
console.log(str.match(reg)); // ["cde"]
// . === [^\r\n]
var reg = /./g;
var str = "你好 世界";
console.log(str.match(reg)) // ["你", "好", " ", "世", "界"]
量词
// n+ {1, Infinity} // 1到无穷个
// n* {0, Infinity} // 0到无穷个
var reg = /\w+/g;
var str = "abc";
console.log(str.match(reg)); // ["abc"]
var reg = /\w*/g;
var str = "abc";
console.log(str.match(reg)); // ["abc", ""] // 贪婪匹配原则 能多不能少
// n? {0, 1} // 0或1个
var reg = /\w?/g;
var str = "abc";
console.log(str.match(reg)); // ["a", "b", "c", ""]
n{x} {x} // x个
var reg = /\w{2}/g;
var str = "abc";
console.log(str.match(reg)); // ["ab"]
n{x} {x,y} // x到y个
var reg = /\w{3,5}/g;
var str = "aaaaaaaaaaaaaaaaaa";
console.log(str.match(reg)); // ["aaaaa", "aaaaa", "aaaaa", "aaa"]
n{x, } {x,Infinity} // x到无穷个
var reg = /\w{2,}/g;
var str = "aaaaaaaaaaaaaaaaaa";
console.log(str.match(reg)); // ["aaaaaaaaaaaaaaaaaa"]
n$ // 以n结尾
var reg = /ed$/g;
var str = "abcded";
console.log(str.match(reg)); // ["ed"]
检验一个字符串首尾是否含有数字
var reg = /^\d|\d$/g;
var str = "123abc";
console.log(reg.test(str)); // true
检验一个字符串首尾是否都含有数字
var reg = /^\d[\s\S]*\d$/g;
var str = "123abc";
console.log(reg.test(str)); // true
属性
var reg = /^\d[\s\S]*\d$/g;
console.log(reg.ignoreCase); // false
console.log(reg.global); // true
console.log(reg.multiline); // false
console.log(reg.source); // "/^\d[\s\S]*\d$/g"
方法
// reg.exec()
// reg.lastIndex
var reg = /ab/g;
var str = "abababab";
console.log(reg.lastIndex); // 0
console.log(reg.exec(str)); // ["ab", index: 0, input: "abababab", groups: undefined]
console.log(reg.lastIndex); // 2
console.log(reg.exec(str)); // ["ab", index: 2, input: "abababab", groups: undefined]
console.log(reg.lastIndex); // 4
console.log(reg.exec(str)); // ["ab", index: 4, input: "abababab", groups: undefined]
console.log(reg.lastIndex); // 6
console.log(reg.exec(str)); // ["ab", index: 6, input: "abababab", groups: undefined]
console.log(reg.lastIndex); // 8
console.log(reg.exec(str)); // null
console.log(reg.lastIndex); // 0
console.log(reg.exec(str)); // ["ab", index: 0, input: "abababab", groups: undefined]
匹配 xxxx
var str = "aaaabbbb";
var reg = /(\w)\1\1\1/g;
console.log(str.macth(reg)); // ["aaaa", "bbbb"]
匹配 xxyy
var str = "aabb";
var reg = /(\w)\1(\w)\2/g;
console.log(str.match(reg)); // ["aabb"]
// match不加g和exec一样 ↓
console.log(reg.exec(str)); // ["aabb", "a", "b", index: 0, input: "aabb", groups: undefined]
支持正则表达式的String对象方法
// search 返回第一次匹配到的位置 匹配不到返回-1
var str = "aabb";
var reg = /(\w)\1(\w)\2/g;
console.log(str.search(reg)); // 0
var str = "edbaabb";
console.log(str.search(reg)); // 3
// split
var str = "123abbc4dd5e6fgg";
var reg = /(\w)\1/
console.log(str.split(reg)); // ["123a", "b", "c4", "d", "5e6f", "g", ""]
var str = "123abbc4dd5e6fggh";
console.log(str.split(reg)); // ["123a", "b", "c4", "d", "5e6f", "g", "h"]
!// replace
var str = "aa";
console.log(str.replace("a", "b")); // ba
var reg = /a/g;
console.log(str.replace(reg, "b")); // bb
// aabb => bbaa
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.replace(reg, "$2$2$1$1")); // bbaa
console.log(str.replace(reg, function($, $1, $2) { // $=>正则表达式匹配的结果
return $2 + $2 + $1 + $1; // bbaa
}))
// the-first-name => theFirstName
var reg = /-(\w)/g;
var str = "the-first-name";
console.log(str.replace(reg, function($, $1) {
return $1.toUpperCase(); // "theFirstName"
}))
// 正向预查/正向断言
var str = "abaaaaa";
var reg = /a(?=b)/g;
console.log(str.macth(reg)); // ["a"]
var reg = /a(?!b)/g;
console.log(str.macth(reg)); // ["a", "a", "a", "a", "a"]
// 贪婪匹配
var str = "aaaaaa";
var reg = /a+/g;
console.log(str.match(reg)); // ["aaaaaa"]
// 非贪婪匹配 加问号
var reg = /a+?/g;
console.log(str.match(reg)); // ["a", "a", "a", "a", "a", "a"]
var reg = /a??/g;
console.log(str.match(reg)); // ["", "", "", "", "", "", ""]
// 去重
var str = "aaaaaabbbbbbcccccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg, "$1")); // abc
// 100000000
var str = "100000000000";
var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg, ".")); // "100.000.000.000"