最近在補充基礎知識,看到了一道面試題 位址傳送點這裡 :
答案:
/**
* 解析乙個url並生成window.location物件中包含的域
* location:
* *
* @param url 需要解析的url
* @return 包含url資訊的物件
*/ function parseurl(url) ;
var keys = ['href', 'origin', 'protocol', 'host',
'hostname', 'port', 'pathname', 'search', 'hash'];
var i, len;
var regexp = /(([^:] :)\/\/(([^:\/\?#] )(:\d )?))(\/[^?#]*)?(\?[^#]*)?(#.*)?/;
var match = regexp.exec(url);
console.info('match=', match);
if (match)
}console.info('result=', result);
return result;
}parseurl("");
結果:match=[
沒錯,一眼就看到了難以理解的是那段正規表示式:
/(([^:] :)\/\/(([^:\/\?#] )(:\d )?))(\/[^?#]*)?(\?[^#]*)?(#.*)?/
剛好最近看了精通正規表示式一書(的20%,哈哈看不完),剛好可以練練手了
首先,在分析之前,先給大家補補基礎概念,知道的就跳過
?: 匹配0個或乙個
* 匹配0個或多個,
: 一次或多次,至少出現一次
.* 貪婪匹配:在滿足匹配時,匹配盡可能長的字串,預設情況下,採用貪婪匹配(沒有問號)
// 非貪婪匹配:在滿足匹配時,匹配盡可能短的字串,使用?來表示非貪婪匹配
? 非貪婪,最小匹配(重點,後面會用到)
*? 重複任意次,但盡可能少重複
? 重複1次或更多次,但盡可能少重複
?? 重複0次或1次,但盡可能少重複
? 重複n到m次,但盡可能少重複
? 重複n次以上,但盡可能少重複
//環視
'jeffs'.replace(/(?<=jeff)(?=s)/i, '"')
//順序環視和逆向環視,?= 匹配的目標位置後緊跟s,匹配的目標位置前緊鄰jeff jeff目標s,結果輸出:jeff"s
[^]: ^表示非 //示例:[^u]
//裡面的元字元只是普通字元
/03[-./]22/.test('03-22') 結果輸出:true
//() :標記乙個子表示式的開始和結束位置。子表示式可以獲取供以後使用
因為匹配結果是按照()的個數和順序決定的,重點是前面9個
最後兩個[index: 0,input: '']是regexp.exec函式自帶返回的
所以上面的表示式可以拆分為如下子表示式:
(([^:] :)\/\/(([^:\/\?#] )(:\d )?))(\/[^?#]*)?(\?[^#]*)?(#.*)?
(([^:] :)\/\/(([^:\/\?#] )(:\d )?))
([^:] :)
(([^:\/\?#] )(:\d )?)
([^:\/\?#] )
(:\d )?
(\/[^?#]*)?
(\?[^#]*)?
(#.*)?
具體分析見下圖:
思考題:
正規表示式分割之千分符格式:
213435324.099.tostring().replace(/\b(?=(\d) (?!\d))/g, ',')
今天就到這裡,喜歡記得點讚~ 18 面試題 正規表示式
使用者名稱 整數 電子郵件位址 email 手機號碼正則。表單驗證必備!有錯誤歡迎指正!1 使用者名稱正則 var username a z0 9 6到16位 大小字母,數字,下劃線,減號 2 整數正則 var pospattern d 匹配正整數 var negpattern d 匹配負整數 va...
面試題53 正規表示式匹配
題目 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配。這是我第一次意識到指...
面試題53 正規表示式匹配
當模式中的第二個字元不是 時 1 如果字串第乙個字元和模式中的第乙個字元相匹配,那麼字串和模式都後移乙個字元,然後匹配剩餘的。2 如果 字串第乙個字元和模式中的第乙個字元相不匹配,直接返回false。而當模式中的第二個字元是 時 如果字串第乙個字元跟模式第乙個字元不匹配,則模式後移2個字元,繼續匹配...