--------------------------正則的作用--------------------------
正則:就是一個(gè)規(guī)則番捂,用來處理字符串的一個(gè)規(guī)則(正則是用來處理字符串的)
處理:
1>匹配? 判斷一個(gè)字符串是否符合我們制定的規(guī)則
var reg = /\d/;
console.log(reg.test("張"));
console.log(reg.test("張3"));
2>捕獲? 把字符串中符合我們正則規(guī)則的內(nèi)容捕獲到
var reg = /\d/;
console.log(reg.exec("張"));
console.log(reg.exec("張3"));
創(chuàng)建一個(gè)正則? 正則兩種創(chuàng)建方式是有區(qū)別的
var reg=/\d/;
var reg=new RegExp("");
如何來學(xué)習(xí)正則挣柬?
RegExp.prototype
----------------------------------正則的元字符和一些簡單的應(yīng)用------------------------------------------
每一個(gè)正則表達(dá)式都是由元字符和修飾符組成的
元字符:在//之間具有意義的一些字符
1、具有特殊意義的字符
\:轉(zhuǎn)義字符义屏,轉(zhuǎn)譯后面字符所代表的含義
^:以某一個(gè)元字符開始
$:以某一個(gè)元字符結(jié)尾
\n:匹配一個(gè)換行符
.:除了\n以外的任意字符
x|y:x或者y中的一個(gè)
[xyz]:x或者y或者z中的一個(gè)字符
[^xyz]除了x y z以外的任意字符
[a-z]:a-z之間任意一個(gè)字符
[^a-z]:除了a-z之間的任何一個(gè)字符
\d:0-9之間數(shù)字
\D除了0-9之間的數(shù)字以外的任何字符
\b:匹配一個(gè)邊界符? var str=”we? we? rrt? y”;
\w:數(shù)字、字母、下劃線中的任意一個(gè)字符[(0-9)(a-z)(A-Z)(_)]
\n換行
\s:匹配一個(gè)空白符 空格....
2闽铐、代表出現(xiàn)次數(shù)的量詞元字符
*:出現(xiàn)0到多次
+:出現(xiàn)1到多次
?:出現(xiàn)零次或1次
{n}出現(xiàn)n次
{n,}出現(xiàn)n到多次
{n,m}出現(xiàn)n到m次
思考:
var reg = /\d/;
console.log(reg.test('fsdf3432'));
var reg = /^\d$/;
console.log(reg.test('0'));
var reg = /^\d+$/;
console.log(reg.test('44465'));
var reg = /^0\.2$/;
console.log(reg.test('0.2'));
var reg=/^[+-]$/;
console.log(reg.test('-'));
驗(yàn)證簡單的手機(jī)號
var reg = /^1\d{10}$/;
():分組:把一個(gè)大正則本身劃分為幾個(gè)小的正則
var reg=/^(\d+)勿忘初心(\d+)$/;? (分成了兩組)
console.log(reg.test('2017勿忘初心2017'));
[]:在中括號中出現(xiàn)的所有字符都是代表本身意思的字符
var reg=/^[.]$/;
console.log(reg.test(‘.’));
[]:不識別兩位數(shù)
var reg = /^[12]$/;代表的是1或者2中的一個(gè)
var reg = /^[\w-]$/;數(shù)字蝶怔、字母、下劃線兄墅、中劃線中的任意一個(gè)
var reg = /^[12-68]$/? (1踢星、2-8中的一個(gè)、8)三個(gè)中的一個(gè)
分組的作用:改變x|y的優(yōu)先級
var reg=18|19;//18 19 181 18 19
var reg=(18|19); //18 19
思考:檢測是否為有效數(shù)字
1隙咸、可以出現(xiàn)小數(shù)點(diǎn)沐悦,也可以不出現(xiàn)小數(shù)點(diǎn),但是出現(xiàn)小數(shù)點(diǎn)后面必須跟著一位或多位數(shù)字
2五督、可以出現(xiàn)+或者-藏否,也可以不出現(xiàn)
3、整數(shù)部分可以是一位整數(shù)充包,也可以是多位整數(shù)副签,但是多位整數(shù)一定不能以0開頭
檢測是否為有效數(shù)字:var reg=/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;
-------------------------------------正則方式創(chuàng)建的區(qū)別--------------------------------------
創(chuàng)建正則的兩種方式
var name = 'zhangsan';
var reg = /^\d+"+name+"\d+$/;
console.log(reg.test('123zhangsan234'));
var reg2 = new RegExp('^\\d+' + name + '\\d+$');
console.log(reg2.test('123zhangsan234'));
區(qū)別:字面量方式中出現(xiàn)的一切都是元字符,所以不能進(jìn)行變量值的拼接基矮,而實(shí)例創(chuàng)建的方式是可以的
字面量方式中直接寫\d就可以继薛,而在實(shí)例中需要把它轉(zhuǎn)譯\\d
-------------------------------------------編寫簡單的正則表達(dá)式--------------------------------------
1、年齡介于18-65之間
var reg = /^(1[8-9]|[2-5]\d|6[0-5])$/;
2愈捅、驗(yàn)證郵箱(簡版)
12324322@qq.com? 2434432@163.com? ? zhang-23423_san@zhangsan.com
var reg=/^[\w.-]+@[0-9a-zA-Z]+(\.[a-zA-Z]{2,4}){1,2}$/;
3遏考、驗(yàn)證身份證(簡版)
var reg=/^\d{17}(\d|X)$/;
----------------------------------------懶惰性和貪婪性-----------------------------------------
正則捕獲:exec
思考:
var reg=/\d+/;
var str='zhangsan2015lisi2016';
var res=reg.exec(str);
console.log(res);
每一次捕獲的時(shí)候都是先進(jìn)行默認(rèn)的匹配,如果沒有匹配成功的蓝谨,捕獲的結(jié)果是null灌具,只有有匹配的內(nèi)容我們才能捕獲到,而且捕獲到的內(nèi)容是一個(gè)數(shù)組
打印出來的結(jié)果捕獲的內(nèi)容格式:
1>捕獲到的內(nèi)容是一個(gè)數(shù)組
數(shù)組中的第一項(xiàng):是當(dāng)前大正則捕獲的內(nèi)容
Index:捕獲內(nèi)容在字符串中開始索引的位置
Input:捕獲的原始字符串
正則捕獲的特點(diǎn):懶惰性每一次執(zhí)行exec只捕獲第一個(gè)匹配的內(nèi)容譬巫,在不配合任何處理的情況下在執(zhí)行咖楣,在執(zhí)行多次捕獲,捕獲的還是第一個(gè)匹配的內(nèi)容
lastIndex:是正則每一次捕獲在字符串中開始查找的位置芦昔,默認(rèn)值是0
如何解決懶惰性诱贿?在正則的末尾添加一個(gè)修飾符”g”
global(g):全局匹配
ignoreCase(i)忽略大小寫
multiline(m)多行匹配
自己編寫正則獲取正則捕獲的所有內(nèi)容(不要忘記加g)
原理:加了全局修飾符g,正則每次捕獲結(jié)束后咕缎,下一次捕獲繼續(xù)查找珠十,一直找到null
var reg = /\d+/g;
var str = 'zhangsan2015lisi2016';
var res = reg.exec(str);
var arr=[];
while(res){
arr.push(res[0])
res = reg.exec(str);
}
console.log(arr);
思考:
var reg = /\d+/g;
var str = 'zhangsan2015lisi2016';
console.log(reg.exec(str));
貪婪性 正則每一次捕獲都是按照最長的結(jié)果捕獲的,捕獲的是2015
解決貪婪性--->在量詞元字符后面添加一個(gè)?即可
凭豪?在正則中有很多作用:
1>放在普通的元字符后面代表是出現(xiàn)0-1次數(shù)字焙蹭,數(shù)字可能出現(xiàn)可能不出現(xiàn)
2>放在量詞元字符后面,取消捕獲時(shí)候的貪婪性
正則中提供了exec的方法嫂伞,字符串中提供了match方法孔厉,也可以捕獲
字符串中的match方法(和exec原理一樣拯钻,就是執(zhí)行的次數(shù)不一樣),把所有和正則匹配的字符都獲取到
var reg = /\d+/g;
var str = 'zhangsan2015lisi2016';
var ary=str.match(reg);
console.log(ary);
match雖然好用但是在分組捕獲的情況下撰豺,match只能捕獲到大正則匹配的內(nèi)容粪般,而對于小正則捕獲的內(nèi)容是無法獲取的
---------------------------分組捕獲-----------------------------------------
思考1:
var reg = /^(\w)\1(\w)\2$/;
var str='ffzz';
console.log(reg.test(str));
正則分組:
1、改變優(yōu)先級
2污桦、分組引用
\2代表和第二個(gè)分組出現(xiàn)一模一樣的內(nèi)容
\1代表和第一個(gè)分組出現(xiàn)一模一樣的內(nèi)容
3刊驴、分組捕獲--->正則在捕獲的時(shí)候,不僅僅把大正則匹配的內(nèi)容捕獲到寡润,而且還可以把小分組匹配的內(nèi)容捕獲到
(?:)在分組中?:的意思是只匹配不捕獲
var reg = /^(\d)(\d)$/;可以捕獲到1、3
var reg = /^(\d)(?:\d)$/;只能捕獲到1
console.log(reg.exec(‘13’));
如果都是正則都是分組這中情況下:match()和exec()捕獲到的結(jié)果是一樣的
以下案例就是math和exec的不一樣的情況
var reg = /zhangsan(\d+)/g;
var str='zhangsan123zhangsan456zhangsan789';
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(str.match(reg));
exec執(zhí)行三次舅柜,每一次執(zhí)行不僅僅把大正則的獲取到梭纹,而且可以獲取第一個(gè)分組匹配的內(nèi)容
math只能捕獲到大正則匹配的內(nèi)容
-------------------------------replace---------------------------------------------
var str = 'zhangsan2016zhangsan2017';
str = str.replace(/zhangsan/g, 'lisi');
replace實(shí)現(xiàn)的原理是:首先和exec捕獲一樣,把所有和我們正則匹配的都捕獲到致份,然后把捕獲的內(nèi)容替換成我們需要替換的新內(nèi)容
第一個(gè)值是正則
第二個(gè)參數(shù)替換成一個(gè)函數(shù)
1>匿名函數(shù)執(zhí)行多少次变抽,取決于正則能在字符串中捕獲多少次--->正則捕獲兩次,所以我們的匿名函數(shù)也執(zhí)行兩次
2>每次執(zhí)行的匿名函數(shù)氮块,里面?zhèn)鬟f的參數(shù)值arguments和我們自己通過exec捕獲到的結(jié)果是一樣的(即使有分組我們也可以通過arguments獲取到分組捕獲的內(nèi)容)
3> return返回的結(jié)果是啥绍载,就相當(dāng)于把當(dāng)前這一次大正則捕獲的內(nèi)容替換成你返回的內(nèi)容
思考1:
str = str.replace(/zhangsan/g, function () {
console.log(arguments);
return 'lisi';
});
console.log(str);
思考2:
var str = 'zhangsan2015zhangsan2016';
str = str.replace(/(\d+)/g, function () {
console.log(arguments[1]);
//arguments[0]大正則捕獲的內(nèi)容,arguments[1]正則捕獲到的第一個(gè)分組(小正則)的內(nèi)容
return 'aaa';
});
思考3:20132014替換成二零一三二零一四
var str = '20132014';
var ary = ["零", "一", "二", "三", "四"];
str = str.replace(/\d/g, function () {
return ary[arguments[0]];
});
console.log(str);
總結(jié):
replace:將原有的字符替換成我們的新的字符
1> 在不使用正則的情況下滔蝉,執(zhí)行一次replace只能替換字符串中的一個(gè)
2>replace是支持正則的击儡,在replace中我們可以一次批量的把所有正則匹配的內(nèi)容都替換掉
原理:先按照正則制定的規(guī)則,到我們字符串中把正則匹配的內(nèi)容捕獲到蝠引,然后在每一次捕獲之后阳谍,都把捕獲的內(nèi)容替換成新的內(nèi)容
1>我們的正則表達(dá)式捕獲到幾次,對應(yīng)的function就要執(zhí)行幾次
2>每一次執(zhí)行function的時(shí)候我們都可以獲取我們捕獲的內(nèi)容----->和我們單獨(dú)執(zhí)行一次exec的內(nèi)容一致
arguments[0]---->exec捕獲數(shù)組的第一項(xiàng)---->大正則捕獲的內(nèi)容
arguments[1]---->exec捕獲數(shù)組的index----->開始捕獲的索引
arguments[2]---->exec捕獲數(shù)組的input------>捕獲的原始字符串
不僅如此螃概,我們小分組捕獲的內(nèi)容也同樣可以獲取到矫夯。
3>我們的function中,通過return來返回我們要替換的內(nèi)容--->return是啥就把大正則捕獲的內(nèi)容進(jìn)行替換
不寫return吊洼,默認(rèn)是用undefined來進(jìn)行替換的
如果不想實(shí)現(xiàn)替換的話训貌,捕獲的內(nèi)容是啥,我們就返回啥------>return argument[0]
案例1:將小寫數(shù)字替換成大寫數(shù)字
var str = '這周我走了3600步';
var ary = ["零", "一", "二", "三", "四", "五", "六"];
str = str.replace(/\d/g, function () {
return ary[arguments[0]];
});
console.log(str);
案例2:var str = 'zhangaaaaa';字符串中挑出出現(xiàn)頻率最高的字符和出現(xiàn)了多少次
var obj = {};
1冒窍、獲取每一個(gè)字符出現(xiàn)的次數(shù)存放到了obj中
str = str.replace(/[a-z]/gi, function () {
var val = arguments[0];
if (obj[val] >= 1) {
obj[val] += 1;
} else {
obj[val] = 1;
}
});
2递沪、出現(xiàn)最多的次數(shù)
var max = 0;
for (var key in obj) {
if (max < obj[key]) {
max = obj[key];
}
}
3、把最大次數(shù)對應(yīng)的key值放到數(shù)組中
var ary = [];
for (var key in obj) {
if (obj[key] == max) {
ary.push(key);
}
}
console.log(ary.toString()+'出現(xiàn)了'+max+'次數(shù)');
:案例3:
var str = "my name is {0},my age is {1},i come from {2},i love {3}";
var ary = ["小紅", 18, "中國", "吃飯"];
把{0}{1}{2}{3}分別替換成"小紅", 18, "中國", "吃飯"
str = str.replace(/{(\d+)}/g, function () {
return ary[arguments[1]];
});
案例4:
將var str = "http://www.baidu.com/index.html?mid=1000&cid=13213&app=1.0";轉(zhuǎn)換為
obj={
mid:1000,
cid:13213,
app:1.0
}
答案:
var reg = /([^?&=]+)=([^?&=]+)/g;
var obj = {};
str = str.replace(reg, function () {
obj[arguments[1]] = arguments[2];
});
案例5 :字符串首字母大寫
var str = "wo shi xiao hong";
var reg = /\b([a-z])/g;
str = str.replace(reg, function () {
return arguments[1].toUpperCase();
});
console.log(str);
案例6:將var str = "2010-8-22 13:10:00";综液,轉(zhuǎn)換為2010年8月22日13時(shí)10分00秒