正則
1.什么是正則:用來(lái)操作字符串的規(guī)則;
正則就是用來(lái)操作(校驗(yàn)跌穗,捕獲)“字符串”的
1)校驗(yàn):返回布爾值 true:符合規(guī)則 false:不合格订晌;
2)捕獲:把符合規(guī)則內(nèi)容拎出來(lái);
正則表達(dá)式:元字符 修飾符
var re=/\d+/g;
兩個(gè)斜杠之間的都是元字符;
斜杠外面的是修飾符蚌吸;
3.元字符包含:代表特殊含義的元字符+代表次數(shù)的量詞元字符
1)代表特殊含義的元字符
\轉(zhuǎn)義
|或
()小分組
. 除了\n以外的其他字符
\n 換行
\b 開(kāi)頭結(jié)尾和空格 匹配一個(gè)邊界
^開(kāi)頭
$結(jié)尾
\s 空格锈拨; \S 非空格
\d 數(shù)字; \D 非數(shù)子
\w 數(shù)字字母下劃線羹唠; \W 非數(shù)字字母下劃線
x|y匹配x或者y中的任意一個(gè)
[a-z]字母 匹配a-z種的任意字符
[^a-z] 非字母
[abc]abc三者中的任何一個(gè)奕枢;
[^abc]除了abc三者中的任何一個(gè)娄昆;
2)代表次數(shù)的量詞元字符
* 0到多
+ 1次或者多次
? 0||1次 ?0次或1次
{n} 正好n次
{n,} n到多
{n,m} n次到m次
4.修飾符缝彬;
g 全局 ? ? ? (global)
i 忽略大小寫(xiě) (ignoreCase)
m 換行 ? ? ? (mulitiline)
分組【】 ()
5.什么時(shí)候加開(kāi)頭和結(jié)尾:
如果從一段字符串中萌焰,查找是否包含某個(gè)小字符-不要加開(kāi)頭和結(jié)尾
嚴(yán)格匹配,必須加開(kāi)頭和結(jié)尾谷浅;
6.中括號(hào)[]的用法:
1)中括號(hào)中放的類似于+,.等特殊符號(hào)都沒(méi)有特殊含義扒俯;
2)中括號(hào)中不會(huì)出現(xiàn)兩位數(shù)
7:()分組的作用:
- ?可以改變正則處理時(shí)候的優(yōu)先級(jí)
- ?分組捕獲:分組其實(shí)可以理解為大正則中分出一個(gè)小正則,在正則捕獲的時(shí)候壳贪,我們不僅僅可以把大正則匹配的結(jié)果捕獲到陵珍,也可以把小分組匹配的結(jié)果捕獲到
- ?分組引用:出現(xiàn)和前面分組一模一樣的結(jié)果
- ? \1 出現(xiàn)第一個(gè)和分組一模一樣的內(nèi)容,但是保證當(dāng)前引用的分組违施,能夠捕獲到(不能加互纯?: ?= 磕蒲?A袅省)
8.當(dāng)/^$/中遇到|的時(shí)候;最好用()提高優(yōu)先級(jí)辣往; reg=/^(18|19)$/;
教驗(yàn)
教驗(yàn)
1兔院;test()校驗(yàn),因?yàn)樗祷氐氖遣紶栔嫡鞠鳎砸话阌糜趇f條件判斷種坊萝,驗(yàn)證某一個(gè)字符串是否符合某一規(guī)則
2;exec:用來(lái)正則捕獲的许起,可以返回一個(gè)數(shù)組十偶,在沒(méi)有小分組的情況下,數(shù)組有三項(xiàng):
1)符合大正則的內(nèi)容园细,捕獲的內(nèi)容
2)index:index捕獲開(kāi)始的索引
3)input:input是原始數(shù)組
3.正則捕獲量大特性:exec
1)懶惰型:每調(diào)用一次惦积,exec,lastIndex永遠(yuǎn)都是從0的位置開(kāi)始查找
- 執(zhí)行一次exec只能捕獲一次猛频,為了解決他的懶惰性狮崩,我們可以添加全局g就能解決了
- lastIndex 正則捕獲的起始位置
- 第一次捕獲的時(shí)候,值為0鹿寻,在正則不做任何處理的情況下睦柴,我們下次捕獲的時(shí)候,這個(gè)值依然是0毡熏,所以會(huì)重復(fù)捕獲第一個(gè)內(nèi)容
- 解決措施:添加全局g
2) 貪婪性:如果用了加號(hào)爱只,永遠(yuǎn)拿到的是最長(zhǎng)的值,
解決措施在+招刹? 這樣每次只能拿到一個(gè)值
4. exec和match的區(qū)別:
- macth必須要加上g恬试,否則只捕獲第一個(gè)
- match只能捕獲到所有符合大正則的內(nèi)容,無(wú)法拿到小分組的信息疯暑;
- 在正則沒(méi)有全局g的情況下训柴,exec和match都只會(huì)捕獲1次;都能拿到小分組的信息妇拯;
- 有全局g的情況下幻馁,exec仍然能拿到小分組信息,
5. reg.replace()兩個(gè)參數(shù)越锈,參1仗嗦;字符串/正則 ? 參2;字符串 匿名函數(shù)
- 在這個(gè)匿名函數(shù)種甘凭,接受的參數(shù)稀拐,跟exec拿到的值一模一樣
- ?匿名函數(shù)被調(diào)用的次數(shù),取決于前面正則匹配成功的次數(shù)
- ?匿名函數(shù)中的argument[0],argument[1],第一個(gè)是獲取到的大正則 第二個(gè)參數(shù)是小分組
- 在函數(shù)中丹弱,你返回的是什么德撬,就相當(dāng)于把reg正則里面的內(nèi)容替換成了什么,不寫(xiě)return 默認(rèn)返回undefined
6. macth 字符串的方法躲胳,捕獲到正則匹配的結(jié)果蜓洪,只要加了分組,捕獲的時(shí)候坯苹,不僅把大正則捕獲到隆檀,而且里面的每一個(gè)小分組,匹配的時(shí)候粹湃,也可以捕獲到恐仑,如果其中某一個(gè)分組,不需要捕獲再芋,我們可以在分組的前面加上菊霜?: 只匹配不捕獲
7; 1)济赎?可有可無(wú)鉴逞;
2)(?司训;)只匹配不捕獲
3)+构捡?解決正則的貪婪性 ?放在一個(gè)量詞元字符后面,代表取消正則捕獲時(shí)候的貪婪性
4)?=正向預(yù)查 ? ? ? ? ? ? ? ? ? ? ? ? ? 匹配不捕獲
5)?!負(fù)向預(yù)查 不需要那個(gè) (壳猜?勾徽!3)不能出現(xiàn)3 匹配不捕獲
6) ? 0||1次 ?0次或1次 在普通的元字符后面统扳,代表出現(xiàn)0-1次
8喘帚;()用法畅姊;
1)在正則中,有/^(18|19)$/,加()提高優(yōu)先級(jí)
2)分組的作用
3)只匹配不捕獲
4)從左往右數(shù)( ?從他開(kāi)始數(shù)小分組
9;誰(shuí)能影響lastIndex 的值
test+g
exec+g
以上兩個(gè)都必須配合g吹由,才能實(shí)現(xiàn)lastIndex值的增加若未;
正則例子
1)手機(jī)號(hào)正則 ? ? /^1\d{10}$/
2)有效數(shù)字正則 ? ?/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
3)驗(yàn)證年齡 18-65 ?/^((18|19)|([2-5]\d)|(6[0-5]))$/;
4)驗(yàn)證郵箱的正則 ? /^([\w.-]+)@([0-9a-zA-Z]+)(\.[a-zA-Z]{2,4}){1,2}$/
5)中文名字 ?/^[\u4e00-\u9fa5]{2,4}$/
6)身份證號(hào)
var reg = /^\d{17}(\d|X)$/;
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/;
7)非空驗(yàn)證 !/^\s*$/
8)去除首尾空格 /(^ +)|( +$)/g
9)偷小說(shuō) /<[^<>]>/g; 注意:textarea 千萬(wàn)不要通過(guò)innerHTML取值,因?yàn)槟隳貌坏角泠辏荒芡ㄟ^(guò)value才能內(nèi)容粗合; var reg=/<[^<>]+>/g
10)去除收尾空格
var reg=/(^ +)|( +$)/g;
var reg=/(^ +| +$)/g;
var reg=/(^\s+|\s+$)/g;
//去除字符串中所有的空格;
var reg=/\s+/g;
11)var reg=/^([a-z])$/
12)百度昵稱英文14位乌昔,漢字七個(gè)
function chekNick(nick) {
var reg1=/^[\u4e00-\u9fa5]$/ //檢測(cè)是否為中文
var reg2=/^\w$/; ? ? ? ? ? ?//檢測(cè)是否為 數(shù)字 字母 下劃線
var len=0;
for (var i=0;i
var cur=nick[i];
if (reg1.test(cur)){
len+=2
}else if(reg2.test(cur)) {
len++;
}else {
len=0;
break;
}
}
if (len==0||len>14){
return false;
}
return true;
}
13)密碼 數(shù)字或字母組合在一起的(6-10)位
var reg=/^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,10}$/
14) ?出現(xiàn)一個(gè)數(shù)字隙疚,但是不能是3,然后這個(gè)機(jī)制可以出現(xiàn)多次
var reg=/^((?!3)\d)+$/;
myExecAll
RegExp.prototype.myExecAll=function () {
var str=arguments[0]||'';//如果第一個(gè)參數(shù)值沒(méi)有傳遞的話磕道,我們默認(rèn)為空字符串
//正則加g才能捕獲全部供屉,沒(méi)有加的話,我們只讓其捕獲第一個(gè)即可 this是reg g=global
if (!this.global){
return this.exec(str)
}
var ary=[]
var resZs=this.exec(str)
while (resZs){
ary.push(resZs[0])
resZs=this.exec(str)
}
return ary.length===0?null:ary
}
reg.myExecAll(str)
myMatch
String.prototype.myMatch=function(reg){
//this:字符串實(shí)例
var res=reg.exec(this);
var ary=[];
while(res){
ary.push(res[0]);
res=reg.exec(this);
}
return ary;
}
var ary=str.myMatch(reg);
console.log(ary);
回調(diào)函數(shù)
11.回調(diào)函數(shù)注意4點(diǎn):
1)什么時(shí)候被調(diào)用捅厂?調(diào)用次數(shù)贯卦?
2)是否傳參
3)是否改變this指向
4)是否有返回值;
//ForEach在瀏覽器下不兼容焙贷,我們寫(xiě)這個(gè)方法讓他在瀏覽器下兼容
var ary=[12,14,19,33,22]
var obj={}
Array.prototype.myForEach=function (cb,context) {
//context代表的是this
context=context||window
//瀏覽器兼容撵割,就直接使用瀏覽器兼容的方法
if ('forEach'in Array.prototype){
this.forEach(cb,context);
return;//阻斷代碼
}
//當(dāng)瀏覽器不支持的時(shí)候,自己寫(xiě)兼容方法
for(var i=0;i
cb.call(context,this[i],i,this)
//改變this指向
}
}
//調(diào)用封裝的myForEach這個(gè)方法
var res=ary.myForEach(function (item,index,input) {
console.log(item,index,input)
})
console.log(res)