\w     [0-9A-z_]
\W [^\w]
\d [0-9]
\D [^\d]
\s [\t\n\r\v\f]
\S [^\s]
\b 单词边界
\B 非单词边界
. [^\r\n]


量词 正则是贪婪的



n+  {1,infinity}
n* {0,infinity}
n? {0,1}
n{x} {x} x个
n{x,y} {x,y} x-y个
n{x,} {x,infinity}


位置



^n
n$


方法



reg.test();
str.match();



var reg = /\w*/g;
var str = "abc";
str.match(reg) //["abc",""]


var reg = /^abc$/g; //以当前abc开头,并以当前abc结尾
var str = "abcabc";
str.match(reg) //null


//检验一个字符串首尾是否含有数字
var reg = /^\d|\d$/g; //首或尾有数字
var reg = /^\d[\s\S]*\d$/g; //首尾都有数字



//前提是reg要加g否则值不变
reg.lastIndex //返回位置
reg.exec() //返回的数组里包括位置
reg.lastIndex=0 //更改位置

var str = "aaaa";
var reg = /(\w)\1\1\1/g; //["aaaa"]

var str = "aabb";
var reg = /(\w)\1(\w)\2/g;//["aabb"]

console.log(reg.exec(str));//["aabb","a","b"]
console.log(str.match(reg));//reg不加g["aabb","a","b"]
console.log(str.match(reg));//reg加g["aabb"]
var str = "ebdaabbbbcc";
console.log(str.search(reg));//[3] 返回匹配到的位置,失败返回-1
var str = "ebda2abbbbc3c";
var reg = /\d/g; //按重复的字母拆分数组
console.log(str.split(reg));//返回拆分后的数组



var str = "aa";
console.log(str.replace("a","b")) //"ba"
var reg = /a/g;
str.replace(reg,"b"); //bb


//aabb
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
str.replace(reg,"$2$2$1$1") //bbaa
str.replace(reg,function($,$1,$2){
return $2+$2+$1+$1; //bbaa;
})


var str = "the-first-name"; //theFirstName
var reg = /-(\w)/g;
str.replace(reg,function($,$1){
return $1.toUpperCase();
})



正向预查
var str = "abaaaaa" //查后面有b的a;
var reg = /a(?=b)/g;
var reg = /a(?!b)/g; //["a","a","a","a","a"]
str.match(reg); //a



非贪婪匹配
var str = "aaaaaa";
var reg = /a+/g; //["aaaaaa"]
var reg = /a+?/g; //["a","a","a","a","a","a"]



练习 字符串去重
var str = "aaaaaaabbbbbbbcccccc";
var reg = /(\w)\1*/g;
str.replace(reg,"$1")


数字科学计数法
var str = "100000000";
var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,"."));//100.000.000