----------------------------------正則的作用-------------------------------------------
正則:就是一個(gè)規(guī)則,用來(lái)處理字符串的一個(gè)規(guī)則(正則是用來(lái)處理字符串的)
處理:
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("");
如何來(lái)學(xué)習(xí)正則贡未?
RegExp.prototype
----------------------------------正則的元字符和一些簡(jiǎn)單的應(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)證簡(jiǎn)單的手機(jī)號(hào)
var reg = /^1\d{10}$/;
():分組:把一個(gè)大正則本身劃分為幾個(gè)小的正則
var reg=/^(\d+)勿忘初心(\d+)$/; (分成了兩組)
console.log(reg.test('2017勿忘初心2017'));
[]:在中括號(hào)中出現(xiàn)的所有字符都是代表本身意思的字符
var reg=/^[.]$/;
console.log(reg.test(‘.’));
[]:不識(shí)別兩位數(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)先級(jí)
var reg=18|19;//18 19 181 18 19
var reg=(18|19); //18 19
思考:檢測(cè)是否為有效數(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開頭
檢測(cè)是否為有效數(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
-------------------------------------------編寫簡(jiǎn)單的正則表達(dá)式--------------------------------------
1张遭、年齡介于18-65之間
var reg = /^(1[8-9]|[2-5]\d|6[0-5])$/;
2缔恳、驗(yàn)證郵箱(簡(jiǎ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)證身份證(簡(jiǎ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)的匹配扑眉,如果沒(méi)有匹配成功的腰素,捕獲的結(jié)果是null弓千,只有有匹配的內(nèi)容我們才能捕獲到,而且捕獲到的內(nèi)容是一個(gè)數(shù)組
打印出來(lái)的結(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));
貪婪性 正則每一次捕獲都是按照最長(zhǎng)的結(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)容褐望,而對(duì)于小正則捕獲的內(nèi)容是無(wú)法獲取的
---------------------------分組捕獲-----------------------------------------
思考1:
var reg = /^(\w)\1(\w)\2$/;
var str='ffzz';
console.log(reg.test(str));
正則分組:
1瘫里、改變優(yōu)先級(jí)
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和我們自己通過(guò)exec捕獲到的結(jié)果是一樣的(即使有分組我們也可以通過(guò)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á)式捕獲到幾次闲勺,對(duì)應(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中,通過(guò)return來(lái)返回我們要替換的內(nèi)容--->return是啥就把大正則捕獲的內(nèi)容進(jìn)行替換
不寫return,默認(rèn)是用undefined來(lái)進(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ù)對(duì)應(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, "中國(guó)", "吃飯"];
把{0}{1}{2}{3}分別替換成"小紅", 18, "中國(guó)", "吃飯"
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秒
第五節(jié)正則
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門剪芍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峡继,你說(shuō)我怎么就攤上這事贮折〗翊” “怎么了作儿?”我有些...
- 文/不壞的土叔 我叫張陵策添,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仪媒,道長(zhǎng)谢鹊,這世上最難降的妖魔是什么求冷? 我笑而不...
- 正文 為了忘掉前任官撼,我火速辦了婚禮掠哥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牵咙。我一直安慰自己吠谢,他們只是感情好刃麸,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般把沼。 火紅的嫁衣襯著肌膚如雪啊易。 梳的紋絲不亂的頭發(fā)上,一...
- 那天饮睬,我揣著相機(jī)與錄音租谈,去河邊找鬼。 笑死捆愁,一個(gè)胖子當(dāng)著我的面吹牛割去,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昼丑,決...
- 文/蒼蘭香墨 我猛地睜開眼呻逆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了菩帝?” 一聲冷哼從身側(cè)響起咖城,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呼奢,沒(méi)想到半個(gè)月后宜雀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡握础,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年辐董,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓候。...
- 正文 年R本政府宣布依鸥,位于F島的核電站亥至,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贱迟。R本人自食惡果不足惜姐扮,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣吠。 院中可真熱鬧茶敏,春花似錦、人聲如沸缚俏。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至恬惯,卻和暖如春向拆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酪耳。 一陣腳步聲響...
- 正文 我出身青樓颈将,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親讹堤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吆鹤,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 正則表達(dá)式 正則表達(dá)式,又稱正規(guī)表示式洲守、正規(guī)表示法疑务、正規(guī)表達(dá)式、規(guī)則表達(dá)式梗醇、常規(guī)表示法(英語(yǔ):Regular Ex...
- 五 冬風(fēng)呼嘯知允,刮起的樹葉,一次次的吹進(jìn)了眼前的長(zhǎng)江里叙谨。仿佛有一種無(wú)形的手在操作著這些枯葉殘枝温鸽,幾乎沒(méi)有多少留在岸邊...
- 第六稿《腦波島》第五章《出租器官》 鐘天心 第五節(jié) 子丹再次輕輕的用手對(duì)著激光模型一揮,模型上的皮膚全部隱去手负。子丹...
- 第二天一早涤垫,葉知秋和軒轅瑾瑜就分別早早起來(lái)了,因?yàn)楹笠蝗账麄兌家巴鹿忍綄毦怪眨泻芏鄿?zhǔn)備工作需要做蝠猬。 而另一邊呢,...
- 你一定充滿困惑匆绣,愛不就是正能量嗎?沒(méi)錯(cuò)什黑,愛就是正能量崎淳,但愛情里未必。 情境一:你哭著說(shuō)愕把,童話里都是騙人的拣凹。我對(duì)Ta...