正則表達式相關(guān)

\d, \w, \s, [a-zA-Z0-9], \b, ., *, +, ?, x{3}, ^,$分別是什么?

\d:匹配一個數(shù)字医舆。等價于[0-9]。
例如碍粥, /\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。
\w:匹配任意字母、數(shù)字或者下劃線雁社。等價于[A-Za-z0-9_]。
例如, /\w/ 匹配 "apple," 中的 'a'晒骇,"$5.28,"中的 '5' 和 "3D." 中的 '3'霉撵。
\s:匹配一個空白字符,包括空格洪囤、制表符徒坡、換頁符和換行符。
等價于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]瘤缩。
例如, /\s\w*/ 匹配"foo bar."中的' bar'喇完。
[a-zA-Z0-9]:匹配任意字母、數(shù)字款咖。
\b:匹配一個詞的邊界何暮。
一個詞的邊界就是一個詞不被另外一個詞跟隨的位置或者不是另一個詞匯字符前邊的位置。注意铐殃,一個匹配的詞的邊界并不包含在匹配的內(nèi)容中海洼。換句話說,一個匹配的詞的邊界的內(nèi)容的長度是0富腊。
例子:
/\bm/匹配“moon”中得‘m’坏逢;
/oo\b/并不匹配"moon"中得'oo',因為'oo'被一個詞匯字符'n'緊跟著赘被。
/oon\b/匹配"moon"中得'oon'是整,因為'oon'是這個字符串的結(jié)束部分。這樣他沒有被一個詞匯字符緊跟著民假。
/\w\b\w/將不能匹配任何字符串浮入,因為一個單詞中的字符永遠也不可能被一個非詞匯字符和一個詞匯字符同時緊跟著。
.:匹配除回車(\r)羊异、換行(/n)符之外的任何單個字符事秀。等價于[^\n\r]
如/.n/將會匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不會匹配 'nay'野舶。
*:匹配前一個表達式0次或多次易迹,等價于{0,}。
如/bo*/會匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b'平道,但是在 "A goat grunted" 中將不會匹配任何東西睹欲。
+:匹配前面一個表達式1次或者多次。等價于 {1,}。
如/a+/匹配了在 "candy" 中的 'a'窘疮,和在 "caaaaaaandy" 中所有的 'a'袋哼。
?:匹配前面一個表達式0次或者1次。等價于 {0,1}考余。
例如先嬉,/e?le?/ 匹配 "angel" 中的 'el',和 "angle" 中的 'le' 以及"oslo' 中的'l'楚堤。
如果緊跟在任何量詞 *疫蔓、 +、? 或 {} 的后面身冬,將會使量詞變?yōu)榉秦澙返模ㄆヅ浔M量少的字符)衅胀,和缺省使用的貪婪模式(匹配盡可能多的字符)正好相反。
例如酥筝,對 "123abc" 應(yīng)用 /\d+/ 將會返回 "123"滚躯,如果使用 /\d+?/,那么就只會匹配到 "1"。
還可以運用于先行斷言嘿歌。
x{3}:量詞限定符掸掏,一個給定組件x必須要出現(xiàn)3次才能滿足匹配,即匹配'xxx'宙帝。
^:匹配輸入的開始丧凤。
如果多行標志被設(shè)置為true,那么也匹配換行符后緊跟的位置步脓,如/^A/并不會匹配"an A"中的'A'愿待,但會匹配"An E"中的'A'。當'^'作為第一個字符出現(xiàn)在[]內(nèi)時表示“非”
$:匹配輸入的結(jié)束靴患。
如果多行標志被設(shè)置為true仍侥,那么也匹配換行符前緊跟的位置,如/t$/并不會匹配"eater"中的't'鸳君,但會匹配"eat"中的't'农渊。

寫一個函數(shù)trim(str),去除字符串兩邊的空白字符

function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
}

console.log(trim(' hello world ')); //hello world
console.log(trim('   hello world   ')); //hello world
console.log(trim('hello world')); //hello world

寫一個函數(shù)isEmail(str)或颊,判斷用戶輸入的是不是郵箱

function isEmail(str) {
    //將捕獲組內(nèi)的\.\w作為一個整體匹配一次或多次
    return /^\w+\.?\w+@\w+(\.\w+)+$/.test(str)
}

console.log(isEmail('dolby.dot@gmail.com')); //true
console.log(isEmail('938661877@qq.com')); //true
console.log(isEmail('xxxxxx@xxx.com.cn')); //true
console.log(isEmail('  dolby.dot@outlook.com'));//false

寫一個函數(shù)isPhoneNum(str)腿时,判斷用戶輸入的是不是手機號

function isPhoneNumber(str) {
    return /^1[34578]\d{9}$/g.test(str);
}

console.log(isPhoneNumber(13871299999)); //true
console.log(isPhoneNumber(1387129999922)); //false
console.log(isPhoneNumber('13871299999zs')); //false

寫一個函數(shù)isValidUsername(str),判斷用戶輸入的是不是合法的用戶名(長度6-20個字符饭宾,只能包括字母、數(shù)字格了、下劃線)

function isValidUsername(str) {
    return /^\w{6,20}$/.test(str)
}

console.log(isValidUsername('sajhdaskdjsdscsfdgdfgfhghfghfghfai-')); //false
console.log(isValidUsername('sajhdaskdjsdsc')); //true
console.log(isValidUsername('  sajhdaskdjsdsc')); //false

寫一個函數(shù)isValidPassword(str), 判斷用戶輸入的是不是合法密碼(長度6-20個字符看铆,只包括大寫字母、小寫字母盛末、數(shù)字弹惦、下劃線否淤,且至少包括兩種)

function isValidPassword(str) {
    var count = 0;
    if (/^\w{6,20}$/.test(str)) {
        if (/[A-Z]/.test(str)) {
            count++;
        }
        if (/[a-z]/.test(str)) {
            count++;
        }
        if (/[0-9]/.test(str)) {
            count++;
        }
        if (/-/.test(str)) {
            count++;
        }
        if (count >= 2) {
            return true;
        }
    } return false;
}
console.log(isValidPassword('sa1h-'));
console.log(isValidPassword('jhdaskdjsdsc'));
console.log(isValidPassword('J21_3djsdsc'));

寫一個正則表達式,得到如下字符串里所有的顏色

var re = /#[a-fA-F0-9]{6}/g;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee "
console.log(subj.match(re))  // ['#121212', '#AA00ef']

什么是貪婪模式和非貪婪模式

首先要明白一點:正則表達式中棠隐,最先開始的匹配擁有最高的優(yōu)先權(quán)石抡。

  • 貪婪模式:
    在貪婪(默認)模式下,正則引擎盡可能多的重復(fù)匹配字符助泽,默認情況下啰扛,?, +, *, {min,}, {min, max}都是貪婪的。也就是說嗡贺,它會根據(jù)前導(dǎo)字符去匹配盡可能多的內(nèi)容隐解。貪婪模式與捕獲組結(jié)合可提升匹配效率,如前文中判斷用戶輸入的是不是郵箱一題中所寫诫睬。
  • 非貪婪模式:
    在量詞后加上?可關(guān)閉貪婪模式煞茫,非貪婪模式下,正則引擎盡可能少的重復(fù)匹配字符摄凡。也就是說续徽,一旦發(fā)現(xiàn)匹配符合要求,立馬就匹配成功亲澡,而不會繼續(xù)匹配下去(除非有g(shù)钦扭,開啟下一組匹配)。

舉例:
下面代碼輸出什么? 為什么? 改寫代碼谷扣,讓其輸出[""hunger"", ""world""].

var str = 'hello  "hunger" , hello "world"';
var pat =  /".*"/g;
str.match(pat); 

輸出[""hunger" , hello "world""]土全,因為/".*"/g的意思是匹配str字符串中所有雙引號""之間的的除回車和換行符之外的任意多個字符,而正則表達式默認下是貪婪模式, 也就是會匹配盡量長的 (第1個到最后1個) 雙引號之間的內(nèi)容会涎,所以結(jié)果如上裹匙。
改寫代碼:

var str = 'hello  "hunger" , hello "world"';
var pat = /".*?"/g; //在量詞后加上?可關(guān)閉貪婪模式
str.match(pat); //[""hunger"", ""world""]

總結(jié):如果是貪婪匹配模式,正則引擎會一直匹配到字符串最后末秃;當匹配為false時概页,就回溯以找到倒數(shù)第一個匹配位置,返回匹配結(jié)果练慕。 如果是非貪婪匹配模式惰匙,正則引擎會匹配到符合pattern的末尾位置那個字符,然后再往后走一步铃将,發(fā)現(xiàn)匹配為false時项鬼,就回溯以找到最近一個匹配為true的位置,返回匹配結(jié)果劲阎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绘盟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌龄毡,老刑警劉巖吠卷,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沦零,居然都是意外死亡祭隔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門路操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疾渴,“玉大人,你說我怎么就攤上這事寻拂〕痰欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵祭钉,是天一觀的道長瞄沙。 經(jīng)常有香客問我,道長慌核,這世上最難降的妖魔是什么距境? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮垮卓,結(jié)果婚禮上垫桂,老公的妹妹穿的比我還像新娘。我一直安慰自己粟按,他們只是感情好诬滩,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灭将,像睡著了一般疼鸟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庙曙,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天空镜,我揣著相機與錄音,去河邊找鬼捌朴。 笑死吴攒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的砂蔽。 我是一名探鬼主播洼怔,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼左驾!你這毒婦竟也來了茴厉?” 一聲冷哼從身側(cè)響起泽台,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矾缓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稻爬,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嗜闻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桅锄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉雳。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖友瘤,靈堂內(nèi)的尸體忽然破棺而出翠肘,到底是詐尸還是另有隱情,我是刑警寧澤辫秧,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布束倍,位于F島的核電站,受9級特大地震影響盟戏,放射性物質(zhì)發(fā)生泄漏绪妹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一柿究、第九天 我趴在偏房一處隱蔽的房頂上張望邮旷。 院中可真熱鬧,春花似錦蝇摸、人聲如沸婶肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽律歼。三九已至,卻和暖如春蜂嗽,著一層夾襖步出監(jiān)牢的瞬間苗膝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工植旧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辱揭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓病附,卻偏偏與公主長得像问窃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子完沪,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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