\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é)果劲阎。