JavaScript 正則表達(dá)式

正則表達(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)。

Paste_Image.png

這些符號(hào)如果要去匹配抚岗,都需要用"\"反斜杠來(lái)進(jìn)行轉(zhuǎn)義或杠。

如果我要匹配a-z,26個(gè)英文字母,我們?cè)趺磥?lái)寫(xiě)這個(gè)表達(dá)式呢宣蔚?

正則表達(dá)式給我們提供了字符類(lèi)的工具廷痘。

Paste_Image.png

這里面會(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)的工具件已。

Paste_Image.png

用實(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á)式給我們提供了選擇符枢冤。

Paste_Image.png

比如說(shuō)我們想匹配a字符或者b字符。

var re = /a|b/i;
re.test('a');//true
re.test('b');//true
re.test('c');//false

定位符

Paste_Image.png

比如說(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)志

Paste_Image.png

標(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ì)象的方法

Paste_Image.png

以上是正則表達(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ù)名正則

  1. 要求是數(shù)字,字母(不分大小寫(xiě))家肯,漢字龄砰,下劃線
  2. 長(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累提。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市磁浇,隨后出現(xiàn)的幾起案子斋陪,更是在濱河造成了極大的恐慌,老刑警劉巖置吓,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件无虚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衍锚,警方通過(guò)查閱死者的電腦和手機(jī)友题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戴质,“玉大人度宦,你說(shuō)我怎么就攤上這事「娼常” “怎么了戈抄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)后专。 經(jīng)常有香客問(wèn)我划鸽,道長(zhǎng),這世上最難降的妖魔是什么戚哎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任裸诽,我火速辦了婚禮,結(jié)果婚禮上型凳,老公的妹妹穿的比我還像新娘丈冬。我一直安慰自己,他們只是感情好甘畅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布殷蛇。 她就那樣靜靜地躺著,像睡著了一般橄浓。 火紅的嫁衣襯著肌膚如雪粒梦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天荸实,我揣著相機(jī)與錄音匀们,去河邊找鬼。 笑死准给,一個(gè)胖子當(dāng)著我的面吹牛泄朴,可吹牛的內(nèi)容都是我干的重抖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼祖灰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钟沛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屿脐,失蹤者是張志新(化名)和其女友劉穎娩践,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畜埋,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年畴蒲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悠鞍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡模燥,死狀恐怖咖祭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔫骂,我是刑警寧澤心肪,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站纠吴,受9級(jí)特大地震影響硬鞍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戴已,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一固该、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糖儡,春花似錦伐坏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至金闽,卻和暖如春纯露,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背代芜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工埠褪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓钞速,卻偏偏與公主長(zhǎng)得像贷掖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渴语,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容