<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RegExp</title>
</head>
<body>
<script>
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/ //<p></p> <div />
// 正则表达式是匹配模式,要么匹配字符,要么匹配位置。
// reg.test() true false
// str.match() 返回匹配到的所有子项数组
// ^a 以a开头
// [abc] 表达式的查找范围,匹配其中的一位,(范围表示法)
// [^abc] 此时的^符号表示非,即不在abc范围的任何一个字符(排除字符组)
// [A-z0-9] 字符分组
// (abc|bdc) 分支结构-惰性的(先匹配前面的)
// . === [^\r\n] 点. 匹配任何一个字符
//
// \w === [_0-9A-z] 单词字符
// \W === [^\w] 非单词字符
//
// \d === [0-9]
// \D === [^0-9]
//
// \b === 单词边界
// \B === 非单词边界
//
//
// \t 制表符
// \r 回车符
// \n 换行符
// \t 垂直制表符
// \f 换页符
// \s === [\t\r\n\v\f ] 还有一个空格
// \S === [^\s]
// ?=n
// ?!n
//
// [\w\d] 举个例子,可以连写
//
// 量词:
// n? 0或1个n === n{0,1}
// n+ 1或多个n === n{1,}
// n* 0或多个n === n{0,}
// {m} 等价于{m,m},表示出现m次。
// {m,n},表示连续出现最少m次,最多n次。
//
// 贪婪匹配
var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log(string.match(regex));// => ["123", "1234", "12345", "12345"]
// 通过在量词后面加个问号就能实现惰性匹配,因此所有惰性匹配情形如下:
var regex = /\d{2,5}?/g;
console.log( string.match(regex) );// => ["12", "12", "34", "12", "34", "12", "34", "56"]
// {m,n}?
// {m,}?
// ??
// +?
// *?
// -----------reg.test-------------------------------------------------
// let re = null
// for(let i; i< 10;i++) {
// re = /cat/g
// re.test("catastrophe")
// }
// for(let i; i< 10;i++) {
// re = new RegExp("cat","g")
// re.test("catastrophe")
// }
// ------------------------------------------------------------
// var reg = /[1234567890][1234567890][1234567890]/g;
// var str = "123456sdsd223def434d";
// console.log(str.match(reg)); // ["123", "456", "223", "434"]
// ------------------------------------------------------------
// str.match() 返回匹配到的所有子项数组
// var reg1 = /(\w)\1(\w)\2/; //无全局g 匹配两两相同的字符,反向引用第一个子表达式匹配的内容 \1反向引用第一个子表达式 () 就是子表达式
// var reg2 = /(\w)\1(\w)\2/g; //有全局g
// var str = "aabbcaabb";
// console.log(str.match(reg1));//match() 返回数组,无全局g 时,一次匹配,返回包括子表达式的内容,不会继续向下搜索
// console.log(str.match(reg2));//match()返回数组,有全局g,全局匹配,只返回匹配的内容,不返回返回包括子表达式的内容
// var reg = /^a/gm;
// var str = "abab\nabab";
// console.log(str.match(reg)); //["a","a"]
//
// var reg = /^[bc]at/g;
// var str = "bat1";
// console.log(str.match(reg));//["bat"]
//
// ---------边界---------------------------------------------------
// \b === 单词边界
// \B === 非单词边界
// var reg = /\bccd\B/g;
// var str = "bc ccds";
// console.log(str.match(reg));
// ------------------------------------------------------------
// 检验字符串首尾是否含有数字
// var reg = /^\d|\d$/gi;
//
//
// ---------reg.exec()- 返回数组。包含额外的index和input 属性--------------------------------------------------
// var reg = /ab/g;
// var str = "ababababab";
// console.log(reg.exec(str));
// reg.lastIndex;
// console.log(reg.exec(str));//从上次匹配到的单词末尾继续往下找
// console.log(reg.exec(str));
// console.log(reg.exec(str));
// console.log(reg.exec(str));
// console.log(reg.exec(str));//null
// console.log(reg.exec(str));
//
//
// ---------子表达式--------------------------------------------------
// var reg = /(\w)\1\1\1/g;//匹配四个相同的字符,反向引用第一个子表达式匹配的内容
// // \1反向引用第一个子表达式
// var str = "aaaa";
// console.log(str.match(reg)) //["aaaa"]
//
// var reg = /(\w)\1(\w)\2/g;//匹配四个相同的字符,反向引用第一个子表达式匹配的内容
// // \1反向引用第一个子表达式
// var str = "aabbccdd";
// console.log(reg.exec(str)) //["aabb", "a", "b", index: 0, input: "aabb", groups: undefined]
//
//
// ---------str.replace()--------------------------------------------------
// var str = "aa";
// console.log(str.replace("a","b"));//ba //只能改变一个
// console.log(str.replace(/a/,"b"));//ba //没有g全局,也只能改变一个
// console.log(str.replace(/a/g,"b"));//bb //g全局,改变所有
// 把aabb变成bbaa
// let a = 1
// var str = "aabb";
// var reg = /(\w)\1(\w)\2/;
// console.log(str.replace(reg,"$2$2$1$1"));// $ 也是反向引用子表达式的值
// console.log(str.replace(reg, function ($,$1,$2) { //函数的参数分别表示匹配到的字符串,第一个子表达式,第二个子表达式,以此内推......
// return $2 + $2 + $1 +$1;
// }));//两种方法
// let s = 'aabbccdde'
// let re = s.replace(/(\w)\1/g, function ($str, $1, $2) {
// // 每匹配到就会执行此函数,替换成return的值
// console.log($str);
// if ($str === 'aa') {
// return 'a||'
// } else {
// return 'b||'
// }
// })
// console.log('re', re);
// ---------实战--------------------------------------------------
// the-first-name 变成 theFirstName
// var str = "the-first-name";
// var reg = /-(\w)/g;
// console.log(str.replace(reg,"$1"));
// console.log(str.replace(reg,function ($,$1) {
// return $1.toUpperCase();
// }));
// var str = "abaaaaa";
// var reg1 = /a(?=b)/g;
// var reg2 = /a(?!b)/g;
// console.log(str.match(reg2));//["a"]
</script>
</body>
</html>