面試題之正規表示式解析乙個完整的url

2021-09-27 10:45:09 字數 2291 閱讀 9846

最近在補充基礎知識,看到了一道面試題 位址傳送點這裡 :

答案:

/**

* 解析乙個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個字元,繼續匹配...