問答
一、\d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^,$分別是什么?
- \d:查找數(shù)字;\D 查找非數(shù)字字符。
var str = "a1b2c3"
var patt1 = /\d/g //g表示全局調(diào)用
var patt2 = /\d/ //非全局調(diào)用
console.log(str.match(patt1))
consloe.log(str.match(patt2))
- \w:查找單詞字符(字母、數(shù)字、下劃線);\W:查找非單詞字符。
var str = "a1b2c3"
var patt1 = /\w/g //g表示全局調(diào)用
var patt2 = /\w/ //非全局調(diào)用
console.log(str.match(patt1))
consloe.log(str.match(patt2))
- \s:查找空白字符(空格、tab、換行、回車);\S:查找非空白字符。
var str = "You are the best"
var patt1 = /\s/g
var patt2 = /\s/
console.log(str.match(patt1))
consloe.log(str.match(patt2))
- [a-zA-Z0-9]:查找任何從a到z、從A到Z以及0到9的字符或者數(shù)字。(中括號表示匹配內(nèi)部任意字符,可以連寫)
- \b:匹配單詞邊界;\B:匹配非單詞邊界。(這里的單詞邊界包括開頭、結(jié)尾、空格、中橫線分隔)
var str = "front-end"
var patt1 = /\ben/g //匹配單詞中的en
console.log(str.match(patt1))
- .:查找單個字符(除了換行和行結(jié)束符)。
var str = "That's hot"
var patt1 = /h.t/g //匹配hat和hot
console.log(str.match(patt1))
- *: 出現(xiàn)零次或多次(任意次)。
var str = "front end engineer"
var patt1 = /ne*/g //e出現(xiàn)零次或多次
console.log(str.match(patt1))
- +:出現(xiàn)一次或多次(至少出現(xiàn)一次)。
var str = "front end engineer"
var patt1 = /ne+/g //e出現(xiàn)一次或多次
console.log(str.match(patt1))
- ?:出現(xiàn)零次或一次(最多出現(xiàn)一次)。
var str = "front end engineer"
var patt1 = /ne?/g //e出現(xiàn)零次或一次
console.log(str.match(patt1))
- x{3}:匹配包含3個x的序列的字符串。
var str = "10 1000 10000"
var patt1 = /\d{3}/g
console.log(str.match(patt1))
- ^:以x開頭的字符串
var str="Is this his"
var patt1=/^Is/g
console.log(str.match(patt1))
- $:以x結(jié)尾的字符串
var str="Is this his"
var patt1=/is$/g
console.log(str.match(patt1))
二、貪婪模式和非貪婪模式指什么?
- 貪婪模式
上面已經(jīng)舉過例子了,像? + * {n} {n,m} {n,} {,m}這些量詞在默認(rèn)情況下都是盡可能多的匹配,這就是所謂的貪婪模式。 - 非貪婪模式
非貪婪模式就是和貪婪模式相反,它指的是盡可能少的匹配,一旦匹配到了就不再匹配,也就是在量詞2后面加上?。
代碼
一、寫一個函數(shù)trim(str)去除字符串兩邊的空白字符。
實現(xiàn)方式:
function trim(str) {
var patt = /^\s+|\s+$/g
return str.replace(patt, '')
}
console.log(trim(" front end engineer "))
二、使用正則實現(xiàn)addClass(el, cls)、hasClass(el, cls)、removeClass(el,cls)。
一個元素的class中間以空格隔開,首先要判斷原來的class中是否包含要添加/刪除的class再進(jìn)行操作。

//提示:el為dom元素,cls為操作的class,el.className獲取el元素的class
function hasClass(el, cls) {
//var reg = /^\s+|\s+$/g
var reg = new RegExp('(\\s|^)' + cls + '(\\b|$)')//因為b包括中橫線,所以開頭不能用\b
return reg.test(el.className)
}
function addClass(el, cls) {
if (!hasClass(el, cls)) {
return el.className += ' ' + cls
}
}
function removeClass(el, cls) {
if (hasClass(el, cls)) {
var reg = new RegExp('(\\s|^)' + cls + '(\\b|$)', 'g')
el.className = el.className.replace(reg, '')
}
}
var n = {
className: "aside main extra"
}
console.log(hasClass(n, "main"))
addClass(n, "color")
console.log(n.className)
removeClass(n, "aside")
console.log(n.className)
一開始測試的時候用的變量名為name,導(dǎo)致結(jié)果一直不對。因為var name等于window.name,而這個name是無法修改的。另外還需要注意的是以后測試不要放在控制臺,要寫頁面測試。
三、寫一個函數(shù)isEmail(str),判斷用戶輸入的是不是郵箱。
郵箱:name@domain。
規(guī)則:name可以使用任意ASCII字符,大小寫英文字母 a-z,A-Z;數(shù)字 0-9;字符!#$%&'*+-/=?^_`{|}~;字符 .不能是第一個和最后一個,不能連續(xù)出現(xiàn)兩次。
domain僅限于26個英文字母,10個數(shù)字和連字符-(不能是第一個),長度為2~6。
function isEmail(str) {
var reg = /^([\w-_]+(?:\.[\w-_]+)*)@((?:[a-z0-9]+(?:-[a-z0-9]+)*)+\.[a-z]{2,6})$/i //本來name部分應(yīng)該可以是任意ASCII字符(!#$%&'*+-/=?^_`{|}~),但是試了好久,結(jié)果一直不對,就簡化了,驗證規(guī)則不是很完美。
return reg.exec(str)
}
console.log(isEmail('.cttin@163.com'))
console.log(isEmail('cttin@www.commmmm'))
console.log(isEmail('cttin@163.com'))
后來找了一下資料發(fā)現(xiàn)把上面的\w換成A-Za-z0-9,可以成功運行,不需要轉(zhuǎn)義,不是很明白什么原因。
function isEmail(str) {
var reg = /^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@((?:[a-z0-9]+(?:-[a-z0-9]+)*)+\.[a-z]{2,6})$/i
return reg.exec(str)
}
四、寫一個函數(shù)isPhoneNum(str),判斷用戶輸入的是不是手機號。
function isPhoneNum(str) {
var reg = /^1[3,4,5,7,8]\d{9}$/
return reg.test(str)
}
console.log(isPhoneNum('13456890711'))
console.log(isPhoneNum('13c11111111'))
console.log(isPhoneNum('12345678901'))
五、寫一個函數(shù)isValidUsername(str),判斷用戶輸入的是不是合法的用戶名(長度6-20個字符,只能包括字母、數(shù)字、下劃線)。
function isValidUsername(str) {
var reg = /^\w{6,20}$/
return reg.test(str)
}
console.log(isValidUsername('sss4ffffffffffffgggggggg'))
console.log(isValidUsername('dd_fffff12'))
六、寫一個函數(shù)isValidPassword(str), 判斷用戶輸入的是不是合法密碼(長度6-20個字符,包括大寫字母、小寫字母、數(shù)字、下劃線至少兩種)。
方法一,switch:
function isValidPassword(str) {
var trueNumber = 0
var reg = /^\w{6,20}$/
if(reg.test(str)) {
switch (true) {
case(/[A-Z]/.test(str)): trueNumber++;
case(/[a-z]/.test(str)): trueNumber++;
case(/\d/.test(str)): trueNumber++;
case(/[_]/.test(str)): trueNumber++;
default: break;
}
}
if(trueNumber >= 2) {
return true;
}else {
return false;
}
}
console.log(isValidPassword('_12abAB--'))
console.log(isValidPassword('12abA'))
console.log(isValidPassword('_12ab_'))
console.log(isValidPassword('123456'))
方法二,排除法:
function isValidPassword(str) {
// if(/\w{,6}|\w{20,}/.test(str)) { 這里不能這么寫,最小值不能省略。
if(/\w{0,6}|\w{20,}/.test(str)) {
return false; //排除長度不是6-20的字符
}else if(/[^a-zA-Z0-9_]$/.test(str)) {
return false; //排除非大寫字母、小寫字母、數(shù)字和下劃線的字符串
}else if(/^[a-z]+$|^[A-Z]+$|^[0-9]+$|^[_]+$/.test(str)) {
return false; //排除只有大寫字母、小寫字母、數(shù)字或者下劃線其中一種的字符串
}else {
return true;
}
}
console.log(isValidPassword('222222'))
七、寫一個正則表達(dá)式,得到如下字符串里所有的顏色(#121212)
var re = /*正則...*/
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "
alert( subj.match(re) ) // #121212,#AA00ef
var re = /#[a-fA-F0-9]{3}\s|#[a-fA-F0-9]{6}/g;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "
alert( subj.match(re) ) // ["#121212", "#AA00ef", "#fd2 "](#fd2也是顏色)
八、下面代碼輸出什么? 為什么? 改寫代碼,讓其輸出hunger, world.
var str = 'hello "hunger" , hello "world"';
var pat = /".*"/g;
str.match(pat);
代碼輸出:"hunger" , hello "world"
因為這里默認(rèn)為貪婪模式,會盡可能多的匹配。
若要輸出hunger, world,改成非貪婪模式就可以。
var str = 'hello "hunger" , hello "world"';
var pat = /".*?"/g;
str.match(pat);
九、補全如下正則表達(dá)式,輸出字符串中的注釋內(nèi)容. (可嘗試使用貪婪模式和非貪婪模式兩種方法)
str = '.. <!-- My -- comment \n test --> .. <!----> .. '
re = /.. your regexp ../
str.match(re) // '<!-- My -- comment \n test -->', '<!---->'
var str = '.. <!-- My -- comment \n test --> .. <!----> .. '
//貪婪模式:
var re = /<!--[^>]*-->/g;
str.match(re); // '<!-- My -- comment \n test -->', '<!---->'
//非貪婪模式:
var re = /<!--[\w\W]*?-->/g;
str.match(re) // '<!-- My -- comment \n test -->', '<!---->'
十、補全如下正則表達(dá)式
var re = /* your regexp */
var str = '<> <a href="/"> <input type="radio" checked> <b>'
str.match(re) // '<a href="/">', '<input type="radio" checked>', '<b>'
// 貪婪模式
var re = /<[^>]+>/g
// 非貪婪模式
var re = /<[a-z].*?>/g
var str = '<> <a href="/"> <input type="radio" checked> <b>'
str.match(re) // '<a href="/">', '<input type="radio" checked>', '<b>'
還是九月份寫的,沒有發(fā)表,繼續(xù)回來加油了。