正則表達(dá)式的主要作用是用來(lái)匹配字符沈矿,由于他簡(jiǎn)單且功能強(qiáng)大,所以它不僅用在javascript界拦,很多高級(jí)語(yǔ)言JAVA,PHP等分尸,也都支持正則表達(dá)式锦聊。
工作原理
通配符匹配技術(shù)
定義正則表達(dá)式
JavaScript種正則表達(dá)式有兩種定義方式,定義一個(gè)匹配類(lèi)似 <%XXX%> 的字符串
構(gòu)造函數(shù)
var reg=new RegExp("a","i");
//RegExp是英文正則表達(dá)式的縮寫(xiě)箩绍,
//使用new運(yùn)算符去實(shí)例化這樣一個(gè)對(duì)象就可以了
//("a","i");后面有兩個(gè)參數(shù)"a"(模式) 描述了表達(dá)式的模式孔庭。"i"(修飾符) 區(qū)分大小寫(xiě)的匹配
字面量
var reg=/a/i;
//正則表達(dá)式直接量創(chuàng)建正則表達(dá)式,用"/a/"正則內(nèi)容寫(xiě)在兩個(gè)斜杠中間材蛛,(修飾符)寫(xiě)在斜杠后面圆到。同樣可以創(chuàng)建正則表達(dá)式
例子:
var patt1 = new RegExp("a", "i"); //創(chuàng)建匹配字符串a(chǎn)不區(qū)分大小寫(xiě)不管a字符在單詞任何位置上都是可以匹配的
var a = "Aser";
var b = "afgth";
var c = "sdfga";
//test檢索字符串中指定的值。返回 true 或 false卑吭。
console.log(patt1.test(a)); //true
console.log(patt1.test(b)); //true
console.log(patt1.test(c)); //true
如果我想匹配
*
號(hào)字符怎么辦呢
*
在這是有特殊意義的芽淡,它是去匹配所有字符的。我現(xiàn)在就想要去匹配*
那就需要用到 "\"
轉(zhuǎn)義豆赏,把*
轉(zhuǎn)義下挣菲。
var reg=/\*/i;
var a = "As*er";
console.log(reg.test(a)); //true
現(xiàn)在是匹配*
號(hào),而不是匹配所有字符
類(lèi)似*
的字符掷邦,在正則表達(dá)式中有很多白胀,這些都是特殊字符和符號(hào)。
這些符號(hào)如果要去匹配抚岗,都需要用"\"
反斜杠來(lái)進(jìn)行轉(zhuǎn)義或杠。
如果我要匹配a-z,26個(gè)英文字母,我們?cè)趺磥?lái)寫(xiě)這個(gè)表達(dá)式呢宣蔚?
正則表達(dá)式給我們提供了字符類(lèi)的工具廷痘。
這里面會(huì)定義一些字符類(lèi)
舉例:
var reg=/\w/;
reg.test('sdf');//true
var reg=/\W/;
reg.test('sdf');//false
var reg=/\s/;
reg.test(' ');//true
var reg=/\S/;
reg.test(' ');//false
var reg=/\d/;
reg.test(2);//true
var reg=/\D/;
reg.test(2);//false
var reg=/[as]/;
reg.test('as');//true
reg.test('gg');//false
var reg=/[^as]/;
reg.test('as');//false
reg.test('ff');//true
第一個(gè)“”,代表匹配字符串的開(kāi)頭,第二個(gè)“”,代表匹配非方括號(hào)中的所有字符
var re=/^[^\d]\w+/g
正則表達(dá)式給我們提供了重復(fù)類(lèi)的工具件已。
用實(shí)例來(lái)說(shuō)話笋额。
比如說(shuō)像開(kāi)始咋們寫(xiě)的
var re = /a/i
//正則表達(dá)式直接量創(chuàng)建正則表達(dá)式,用"/a/"正則內(nèi)容寫(xiě)在兩個(gè)斜杠中間篷扩,(修飾符)寫(xiě)在斜杠后面兄猩。同樣可以創(chuàng)建正則表達(dá)式
那么如果發(fā)生改變
var reg=/a{3}/i;
var a = "aaass";
var b = "afgth";
var c = "sdfga";
console.log(reg.test(a)); //true
console.log(reg.test(b)); //false
console.log(reg.test(c)); //false
如果`/a{3}/意思是,要求必須有連續(xù)3個(gè)字符出現(xiàn)才能夠正確的被匹配鉴未。
正則表達(dá)式給我們提供了選擇符枢冤。
比如說(shuō)我們想匹配a
字符或者b
字符。
var re = /a|b/i;
re.test('a');//true
re.test('b');//true
re.test('c');//false
定位符
比如說(shuō)var re = /^a/i;
那么就代表a必須出現(xiàn)在這個(gè)字符串的開(kāi)頭铜秆。
var re = /^a/i;
re.test('aaaa');//true
re.test('ba');//false
re.test('ad');//true
比如說(shuō)var re = /a$/i;
那么就代表a必須出現(xiàn)在這個(gè)字符串的結(jié)尾淹真。
var re = /a$/i;
re.test('asd');//false
re.test('dsa');//true
正則表達(dá)式的分組和標(biāo)志
標(biāo)志怎么來(lái)用
var re = /a/i;
這里用到了i
標(biāo)志,意思就是說(shuō)连茧,當(dāng)我去匹配a字符的時(shí)候核蘸,是不區(qū)分大小寫(xiě)的巍糯。匹配的字符有小寫(xiě)a
,大寫(xiě)A
都能被匹配到客扎。
var re = /a/ig;
全局匹配祟峦,正則表達(dá)式它在工作的時(shí)候,當(dāng)你一個(gè)字符串去匹配的時(shí)候徙鱼,它是從字符串第一個(gè)字母向后去匹配宅楞,當(dāng)它匹配到第一個(gè)a
字符的時(shí)候,它就會(huì)停下來(lái)袱吆,那么加了個(gè)g
以后厌衙,它就會(huì)繼續(xù)向后匹配a
字符。
var re = /a/m;
如果你的字符串是多行的文本绞绒,它就會(huì)在多行文本進(jìn)行匹配迅箩。
正則表達(dá)式對(duì)象的方法
以上是正則表達(dá)式的基本用法,我們通過(guò)這些知識(shí)點(diǎn)再來(lái)強(qiáng)化對(duì)正則表達(dá)式的用法了理解
首先匹配a字母
var re=/a/;
能夠匹配d到g之間的字符
var re=/a[d-g]/;
然后把他們倆分成一組
var re=/(a[d-g])/;
并且這一組要出現(xiàn)兩次
var re=/(a[d-g]){2}/;
不分大小寫(xiě)
var re=/(a[d-g]){2}/i;
那么什么樣的規(guī)則能夠匹配正確呢处铛?
var str = "";
var re = /(a[d-g]){2}/i;
console.log(re.test(str));//false
先需要匹配a字符還要匹配d-g之間的字符饲趋。這兩是一組,這一組要出現(xiàn)兩次所以還要出現(xiàn)a和d-g之間的字符撤蟆。后面可以隨便寫(xiě)
var str = "adaewertt";
var re = /(a[d-g]){2}/i;
console.log(re.test(str));//true
這樣就可以匹配上奕塑。
var str = "tdaewertt";
var re = /(a[d-g]){2}/i;
console.log(re.test(str));//false
var str = "adraewertt";
var re = /(a[d-g]){2}/i;
console.log(re.test(str));//false
根據(jù)要求做正則
做用戶(hù)名正則
- 要求是數(shù)字,字母(不分大小寫(xiě))家肯,漢字龄砰,下劃線
- 長(zhǎng)度要求5-25個(gè)字符推薦使用中文會(huì)員名
[a-zA-Z_0-9]
同等于\w
\u4e00-\u9fa5
代表所有的中文字符
匹配全局有字母a-z,A-Z,數(shù)字0-9,和中文讨衣。如果有就匹配成功
var str = '哈哈hi';
var re=/[\w\u4e00-\u9fa5]/g;
console.log(re.test(str));//true
匹配全局非
字母a-z,A-Z,數(shù)字0-9换棚,和中文。如果非也就是說(shuō)字母數(shù)字中文之外的非法字符了
就匹配成功**
var str = '哈哈hi++';
var re=/[^\w\u4e00-\u9fa5]/g;
console.log(re.test(str));//true
說(shuō)明此字段有非法字符
題外課
如何獲取字符長(zhǎng)度
中文是雙字節(jié)的字符那么如何獲取呢反镇?
獲取英文字節(jié)好獲取
var a='sss';
console.log(a.length);//3
但是中英文在一起就不對(duì)了
var a='sss訂單';
console.log(a.length);//5
我們可以通過(guò)正則[^\x00-\xff]
來(lái)獲取固蚤,[^\x00-\xff]
匹配雙字節(jié)字符(包括漢字在內(nèi))
JavaScript replace() 方法
replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串歹茶。
匹配全局雙字節(jié)字符夕玩,把所有的雙字節(jié)字符替換成xx
var p = '中q訂單';
console.log(p.replace(/[^\x00-\xff]/g, "xx")); //xxqxxxx
xxqxxxx
把中文雙字節(jié)變成了英文單字節(jié),這樣我們就能得出字符的長(zhǎng)度了惊豺,試一試
var p = '中q訂單';
console.log(p.replace(/[^\x00-\xff]/g, "xx").length); //7
判斷相同字符
function findstr(str, n) {
var tmp = 0;
for (var i = 0; i < str.length; i++) {
if (str.charAt(i) == n) {
tmp++;
}
}
return tmp;
}
var g = "ffffff";
var m = findstr(g, g[0]);
if (g.length == m) {
alert("字符相同")
} else {
alert("字符不相同")
}
findstr
函數(shù)有兩個(gè)參數(shù)燎孟,str
是匹配字符串,n
是字符串的第一個(gè)值尸昧。
先在函數(shù)內(nèi)部聲明變量tmp
用str
傳來(lái)的字符串長(zhǎng)度來(lái)循環(huán)
循環(huán)內(nèi)部判斷str
傳來(lái)的字符串遍歷每一個(gè)字符看看是不是等于字符串的第一個(gè)值
如果是就讓變量tmp
+1
否則不加
然后返回變量tmp
var m = findstr(g, g[0]);
m調(diào)用findstr穿參并得到返回值揩页,
if (g.length == m) {
alert("字符相同")
} else {
alert("字符不相同")
}
如果字符串的長(zhǎng)度等于m
也就是字符串都一樣m
的值才會(huì)一樣。所以字符串是相同的烹俗。
如果不是那就說(shuō)明字符串不相同爆侣。
正則判斷不能全為數(shù)字
var re=/[\d]/g;
全局匹配數(shù)字
var re=/[^\d]/g;
全局匹配非數(shù)字字符
var re = /[^\d]/g;
var msg = 12345;
if (!re.test(msg)) {
console.log("全是數(shù)字大哥")
}
正則判斷不能全為字母
var re = /[a-zA-Z]/g;
全局匹配字母
var re = /[^a-zA-Z]/g;
全局匹配非字母字符
var re = /[^a-zA-Z]/g; //匹配所有除字母之外的東西
var msg = "asssssssssss";
if (!re.test(msg)) {
console.log("全是字母大哥")
}
針對(duì)這篇文章萍程,做了個(gè)小demo。歡迎Star累提。