摘要:比如正則表達(dá)式為它們分別匹配的是,元字符在正則表達(dá)式中,有特殊含義的非數(shù)字字符。如果把下面的正則表達(dá)式轉(zhuǎn)換成下圖,會(huì)有助于我們理解正則表達(dá)式的含義。如果想要讓正則表達(dá)式使用非貪婪模式匹配,在量詞后面加個(gè)即可。
1. RegExp對(duì)象
JavaScript有兩種方式實(shí)例化RegExp對(duì)象
字面量
構(gòu)造函數(shù)
const reg = /all/; console.log(reg); // /all/ "This is all I have.".replace(reg, "ALL"); // This is ALL I have.
const reg = new RegExp("all"); console.log(reg); // /all/ "This is all I have.".replace(reg, "ALL"); // This is ALL I have.2. 元字符
原義文本字符
元字符
代表它本來(lái)含義的字符。比如正則表達(dá)式為 /abc/、/123/;它們分別匹配的是 abc、123 ,
在正則表達(dá)式中,有特殊含義的非數(shù)字字符。如: d w . + () 等。部分元字符的含義并不唯一,在不同的書寫方式,含義可能不同。
元字符表:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html
3. 工具推薦不是所有正則表達(dá)式都像前面寫的那么簡(jiǎn)單,因?yàn)檎齽t表達(dá)式語(yǔ)法有些復(fù)雜,我們?cè)趯懙臅r(shí)候多多少少也會(huì)有些錯(cuò)誤,或者閱讀別人寫的正則表達(dá)式的時(shí)候也難理解。
如果把下面的正則表達(dá)式轉(zhuǎn)換成下圖,會(huì)有助于我們理解正則表達(dá)式的含義。
^http(|s)://[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+/$
給大家推薦一個(gè)工具 https://regexper.com
4. 量詞字符 | 含義 |
---|---|
+ | 出現(xiàn)一次或多次(至少出現(xiàn)一次) |
? | 出現(xiàn)零次或一次(最多出現(xiàn)一次) |
* | 出現(xiàn)零次或多次(任意次) |
{n} | 出現(xiàn)n次 |
{n, m} | 出現(xiàn)n到m次 |
{n,} | 至少出現(xiàn)n次 |
// d表示匹配數(shù)字 // 匹配一個(gè)數(shù)字 "1234567890".replace(/d/, "a"); // a234567890 // 匹配一個(gè)或多個(gè)數(shù)字(至少匹配一個(gè)) "1234567890".replace(/d+/, "a"); // a "1234567890".replace(/d?/, "a"); // a234567890 "1234567890".replace(/d*/, "a"); // a "1234567890".replace(/d{3}/, "a"); // a4567890 "1234567890".replace(/d{2,4}/, "a"); // a567890 "1234567890".replace(/d{3,}/, "a"); // a "12".replace(/d{3,}/, "a"); // 12
使用工具 https://regexper.com/ 圖解
d{2,6}
5. 貪婪模式和非貪婪模式從上面 4. 量詞 的例子中,"1234567890".replace(/d+/, "a"); 輸出的是 a 而不是 a234567890;"1234567890".replace(/d{2,4}/, "a"); 輸出的是 a567890 而不是 a34567890。
貪婪模式:正則表達(dá)式盡可能多的匹配,一直到匹配失敗非貪婪模式:正則表達(dá)式盡可能少的匹配,一旦匹配成功就不再匹配
因?yàn)槟J(rèn)情況下,正則表達(dá)式都是使用貪婪模式做匹配的。如果想要讓正則表達(dá)式使用非貪婪模式匹配,在量詞后面加個(gè) ? 即可。
"1234567890".replace(/d{2,4}/, "a"); // a567890 "1234567890".replace(/d{2,4}?/, "a"); // a34567890 "1234567890".replace(/d+/, "a"); // a "1234567890".replace(/d+?/, "a"); // a2345678906. 類
正則表達(dá)式中,可以使用 [] 來(lái)構(gòu)建一個(gè)類,正則表達(dá)式中的類是指符合某些特性的對(duì)象
字符類正則表達(dá)式 [abcd] 是把 a、b、c、d 歸為一類,該表達(dá)式可以匹配這類字符
"12345a6b7c8D9e".replace(/[abcd]/g, "|"); // 12345|6|7|8D9e范圍類
正則表達(dá)式提供了 [a-z] 來(lái)表示從 a 到 z 的任意字符(包含 a 和 z)
"1a2b3c4q5z".replace(/[a-z]/g, "|"); // 1|2|3|4|5| "1a2b3c4T5Z".replace(/[a-z]/g, "|"); // 1|2|3|4T5Z "1a2b3c4T5Z".replace(/[a-zA-Z]/g, "|"); // 1|2|3|4|5| "1a2b3c4q5z".replace(/[0-9]/g, "|"); // |a|b|c|q|z
[a-zA-Z0-9]
預(yù)定義類字符 | 等價(jià)于 | 含義 |
---|---|---|
d | [0-9] | 數(shù)字字符 |
D | [^0-9] | 非數(shù)字字符 |
w | [a-zA-Z0-9_] | 字母、數(shù)字、下劃線(單詞字符) |
W | [^a-zA-Z0-9_] | 非字母、數(shù)字、下劃線(非單詞字符) |
s | [ x0Bf ] | 空白字符 |
S | [^ x0Bf ] | 非空白字符 |
. | [^ ] | 除了換行、回車之外的任意字符 |
字符 | 含義 |
---|---|
^ | 以xxx開(kāi)頭 |
$ | 以xxx結(jié)尾 |
單詞邊界 | |
B | 非單詞邊界 |
"img/png/img-1.png".replace(/img/g, "image"); // image/png/image-1.png "img/png/img-1.png".replace(/^img/g, "image"); // image/png/img-1.png "img/png/img-1.png".replace(/png/g, "jpg"); // img/jpg/img-1.jpg "img/png/img-1.png".replace(/png$/g, "jpg"); // img/png/img-1.jpg "This is all I have.".replace(/is/g, "IS"); // ThIS IS all I have. "This is all I have.".replace(/is/g, "IS"); // This IS all I have. "This is all I have.".replace(/Bis/g, "IS"); // ThIS is all I have.9. 分組 作用
與 | 使用
與量詞使用
反向引用
與 | 使用/http(|s):///
/http(|s):///.test("https://"); // true /http(|s):///.test("http://"); // true /a(b|c)d/.test("ad"); // false /a(b|c)d/.test("abd"); // true /a(b|c)d/.test("acd"); // true與量詞使用
如何匹配 javascript 出現(xiàn)兩次 javascriptjavascript ?
/javascript{2}/.test("javascriptjavascript"); // false /javascript{2}/.test("javascript"); // true /(javascript){2}/.test("javascriptjavascript"); // true反向引用
含有分組的正則表達(dá)式匹配成功時(shí),將子表達(dá)式匹配到的內(nèi)容,保存到內(nèi)存中一個(gè)以數(shù)字編號(hào)的組里,可以簡(jiǎn)單的認(rèn)為是對(duì)一個(gè)局部變量進(jìn)行了賦值,這時(shí)就可以通過(guò)反向引用方式,引用這個(gè)局部變量的值。
很多情況下,我們可能需要將某種格式的字符串轉(zhuǎn)換成另一種格式的字符串。例如:將 05/28/2018 轉(zhuǎn)換成 2018-05-28;將Markdown語(yǔ)法的超鏈接 [Test](https://www.test.com/) 轉(zhuǎn)換成HTML的超鏈接 Test
"05/28/2018".replace(/(d{2})/(d{2})/(d{4})/, "$3-$1-$2"); // => 2018-05-28 "[Test](https://www.test.com/)".replace(/[(.+)]((http(|s)://.+))/, "$1"); // => Test忽略分組
有時(shí)候我們?cè)趯懻齽t表達(dá)式的時(shí)候會(huì)多次使用分組,但有一些分組是不需要反向引用的,比如正則表達(dá)式 /http(|s):/// 中的分組,我們不需要進(jìn)行反向引用,這時(shí)候我們應(yīng)該使用 (?:) 來(lái)忽略分組
不忽略分組:
/http(|s):///
忽略分組:
/http(?:|s):///
10. 前瞻后顧正則表達(dá)式是從頭部(左)向尾部(右)開(kāi)始匹配的,文本的尾部方向稱為“前”,文本的頭部方向稱為“后”
前瞻:正則表達(dá)式在匹配到規(guī)則的時(shí)候,向前檢查是否符合斷言
后顧:正則表達(dá)式在匹配到規(guī)則的時(shí)候,向后檢查是否符合斷言
名稱 | 正則 | 含義 |
---|---|---|
正向前瞻 | exp(?=assert) | 向前檢查符合斷言的 |
負(fù)向前瞻 | exp(?!assert) | 向前檢查不符合斷言的 |
正向后瞻 | (?<=assert)exp | 向后檢查符合斷言的 |
負(fù)向后瞻 | (? | 向后檢查不符合斷言的 |
"ab1cde2fg".replace(/[a-z](?=d)/g, "X"); // aX1cdX2fg "ab1cde2fg".replace(/[a-z](?!d)/g, "X"); // Xb1XXe2XX "ab1cde2fg".replace(/(?<=d)[a-z]/g, "X"); // ab1Xde2Xg "ab1cde2fg".replace(/(? 11. 修飾符global: 是否全文搜索,默認(rèn) false
ignoreCase: 是否大小寫敏感,默認(rèn) false
multiline: 是否多行搜索,默認(rèn) false
lastIndex: 是當(dāng)前表達(dá)式匹配內(nèi)容的最后一個(gè)字符的下一個(gè)位置
source: 正則表達(dá)式的文本字符
"aaaaa".replace(/a/, "A"); // Aaaaa "aaaaa".replace(/a/g, "A"); // AAAAA "aAQq".replace(/[a-z]/g, "X"); // XAQX "aAQq".replace(/[a-z]/gi, "X"); // XXXX /[a-z]/.test("AA"); // false /[a-z]/i.test("AA"); // true `img/png/img-1.png img/png/img-1.png img/png/img-1.png`.replace(/^img/g, "image"); // => image/png/img-1.png // img/png/img-1.png // img/png/img-1.png `img/png/img-1.png img/png/img-1.png img/png/img-1.png`.replace(/^img/gm, "image"); // => image/png/img-1.png // image/png/img-1.png // image/png/img-1.png const reg = /d/gim; console.log(reg.source); // d12. RegExp對(duì)象中 test() 和 exec() test()用于測(cè)試參數(shù)字符串中是否存在匹配正則表達(dá)式模式的字符串;如果存在則返回true,否則返回falseconst reg = /w/; reg.test("|"); // false reg.test("a"); // true reg.test("a"); // true當(dāng)使用 g 全文搜索時(shí),test 函數(shù)會(huì)出現(xiàn)如下問(wèn)題:
上述問(wèn)題其實(shí)是正則表達(dá)式對(duì)象的 lastIndex 屬性在作怪
如果正則表達(dá)式使用了全文搜索 g ,又想避免上述問(wèn)題,應(yīng)在執(zhí)行 test 函數(shù)前先將 lastIndex 置 0
const reg = /w/g; reg.test("ab"); // true reg.lastIndex = 0; reg.test("ab"); // true reg.lastIndex = 0; reg.test("ab"); // trueexec()使用正則表達(dá)式模式對(duì)字符串執(zhí)行搜索,并將匹配到的結(jié)果以數(shù)組形式返回,如果沒(méi)有匹配,返回null結(jié)果數(shù)組屬性
index:匹配字符的第一個(gè)字符的位置
input:被匹配的字符串
返回的數(shù)組
第一個(gè)元素是與正則表達(dá)式匹配的內(nèi)容
第二個(gè)元素是與第一個(gè)子表達(dá)式相匹配的內(nèi)容
第三個(gè)元素是與第二個(gè)子表達(dá)式相匹配的內(nèi)容(以此類推)
現(xiàn)有如下字符串?dāng)?shù)組,我們使用 exec 從每個(gè)元素中提取圖片的路徑
const arr = [ "[測(cè)試1](https://www.test1.com/img/img-1.png)", "[測(cè)試1](http://www.test1.com/img/img-1.jpg)", "[測(cè)試2](https://static.test2.com/image/haha/img-1.png)" ]正則表達(dá)式:
const reg = /[.+](http(|s)://[a-zA-Z0-g_-]+(.[a-zA-Z0-9_-]+)+/((.+/)+.+.(png|jpg)))/;const res = reg.exec(arr[2]);上述正則表達(dá)式使用了較多的分組,我們?cè)陂喿x圖形的時(shí)候可能造成干擾,忽略不必要的分組。
const reg2 = /[.+](http(?:|s)://[a-zA-Z0-g_-]+(?:.[a-zA-Z0-9_-]+)+/((?:.+/)+.+.(?:png|jpg)))/;reg2.exec(arr[2]);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69583.html
摘要:比如正則表達(dá)式為它們分別匹配的是,元字符在正則表達(dá)式中,有特殊含義的非數(shù)字字符。如果把下面的正則表達(dá)式轉(zhuǎn)換成下圖,會(huì)有助于我們理解正則表達(dá)式的含義。如果想要讓正則表達(dá)式使用非貪婪模式匹配,在量詞后面加個(gè)即可。 1. RegExp對(duì)象 JavaScript有兩種方式實(shí)例化RegExp對(duì)象 字面量 構(gòu)造函數(shù) 字面量 const reg = /all/; console.log(reg)...
摘要:比如正則表達(dá)式為它們分別匹配的是,元字符在正則表達(dá)式中,有特殊含義的非數(shù)字字符。如果把下面的正則表達(dá)式轉(zhuǎn)換成下圖,會(huì)有助于我們理解正則表達(dá)式的含義。如果想要讓正則表達(dá)式使用非貪婪模式匹配,在量詞后面加個(gè)即可。 1. RegExp對(duì)象 JavaScript有兩種方式實(shí)例化RegExp對(duì)象 字面量 構(gòu)造函數(shù) 字面量 const reg = /all/; console.log(reg)...
摘要:參考代碼地址四制作字體模板把自己最常接觸的漢字找出來(lái)之后,需要制作一套字體模板,這套字體模板的用處是讓手寫漢字后,順利的找到對(duì)應(yīng)的漢字,這里需要依靠第三方網(wǎng)站提供的一些功能。 一、背景 筆者以前在網(wǎng)上看到有民間高手制作字體的相關(guān)事跡,覺(jué)得把自己的手寫字用鍵盤敲出來(lái)是一件很有意思的事情,所以一直有時(shí)間想制作一套自己的手寫體,前幾天在網(wǎng)上搜索了一下制作字體的方法,發(fā)現(xiàn)技術(shù)上并不是太難,結(jié)合...
摘要:深入使用過(guò)的都會(huì)深深地喜歡上它雖然很流行但是深入了解后你就再也不會(huì)使用了我覺(jué)得不好用速度也慢雖然可以使用作為解析器了另外這種簡(jiǎn)直就是手工時(shí)代的操作很多人使用這幾個(gè)函數(shù)其實(shí)它們使用起來(lái)不是很愉快手工操作的另一個(gè)特征是需要自己手寫正則表達(dá)式正則 深入使用過(guò)lxml的都會(huì)深深地喜歡上它,雖然BeautifulSoup很流行,但是深入了解lxml后,你就再也不會(huì)使用bs了 我覺(jué)得beautif...
摘要:最近準(zhǔn)備初級(jí)前端面試,發(fā)現(xiàn)有很多手寫實(shí)現(xiàn)什么的,例如什么手寫實(shí)現(xiàn),。后面以這道題為引線面試官可能會(huì)追問(wèn)什么是執(zhí)行上下文的判斷,的區(qū)別手寫一個(gè)函數(shù)實(shí)現(xiàn)斐波那契數(shù)列首先拷一個(gè)阮神在他教程里的一個(gè)寫法。 最近準(zhǔn)備初級(jí)前端面試,發(fā)現(xiàn)有很多手寫實(shí)現(xiàn)什么的,例如什么手寫實(shí)現(xiàn)bind,promise。手寫ajax,手寫一些算法。翻閱了很多書籍和博客。 這里做一個(gè)總結(jié)改進(jìn),算是對(duì)我后面大概為期一個(gè)月找...
閱讀 3380·2021-11-22 09:34
閱讀 650·2021-11-19 11:29
閱讀 1350·2019-08-30 15:43
閱讀 2232·2019-08-30 14:24
閱讀 1867·2019-08-29 17:31
閱讀 1223·2019-08-29 17:17
閱讀 2617·2019-08-29 15:38
閱讀 2729·2019-08-26 12:10