摘要:在默認(rèn)的模式下,元字符和分別匹配字符串的開頭和結(jié)尾處,模式改變了這倆元字符的定義,讓他們匹配一行的開頭和結(jié)尾。可以使用非捕獲元字符或來(lái)忽略對(duì)這部分正則表達(dá)式的保存。
一、背景
工作上遇到一個(gè)這樣的需求:
用正則表達(dá)式將一個(gè)字符串中的span標(biāo)簽替換為img標(biāo)簽,并將原span標(biāo)簽的內(nèi)容放到img標(biāo)簽的src中,問(wèn)題詳細(xì)描述:點(diǎn)我
看到這個(gè)需求,我知道應(yīng)該可以用正則表達(dá)式,可是由于之前沒(méi)怎么用,一想到正則表達(dá)式就頭大,一堆各種各樣的特殊符號(hào),似乎沒(méi)有規(guī)律可循,有點(diǎn)難以理解。不過(guò)知道自己不能逃避,于是自己就去嘗試怎么寫這個(gè)正則表達(dá)式來(lái)解決我的需求,上述中提到的問(wèn)題詳細(xì)描述,大概就是我思考的過(guò)程,問(wèn)題提出后立馬有人解答,看完他們的答案后,慚愧,感覺(jué)到自己知識(shí)的欠缺,再不學(xué)習(xí)就老了(┬_┬)
二、正則表達(dá)式基礎(chǔ) 2.1 元字符介紹"^":^會(huì)匹配行或者字符串的起始位置,有時(shí)還會(huì)匹配整個(gè)文檔的起始位置。
"$":$會(huì)匹配行或字符串的結(jié)尾。
"b":不會(huì)消耗任何字符只匹配一個(gè)位置,常用于匹配單詞邊界 如:我想從字符串中"This is Regex"匹配多帶帶的單詞 "is" 正則就要寫成:"This is Regex".match(/is/); "b" 不會(huì)匹配is 兩邊的字符,但它會(huì)識(shí)別is 兩邊是否為單詞的邊界。
"d":匹配數(shù)字。
"w":匹配字母,數(shù)字,下劃線。等價(jià)于"[A-Za-z0-9_]"。
"s":匹配空格。
".":匹配除了換行符以外的任何字符。
"[a-zA-Z]":字符組 匹配包含括號(hào)內(nèi)元素的字符。
幾種反義:改成大寫,意思就與原來(lái)的相反。
如:
"W":匹配任何非單詞字符。等價(jià)于"1"。
"2":匹配除了abc以外的任意字符。
字符轉(zhuǎn)義:在正則表達(dá)式中元字符是有特殊的含義的,當(dāng)我們要匹配元字符本身時(shí),就需要用到字符轉(zhuǎn)義,如:/./.test("."); // true
2.2 量詞 2.2.1 常用量詞"*"(貪婪)重復(fù)零次或更多,貪婪量詞會(huì)首先匹配整個(gè)字符串,嘗試匹配時(shí),它會(huì)選定盡可能多的內(nèi)容,如果 失敗則回退一個(gè)字符,然后再次嘗試回退的過(guò)程就叫做回溯,它會(huì)每次回退一個(gè)字符,直到找到匹配的內(nèi)容或者沒(méi)有字符可以回退。如:
"aaaaaa".match(/a*/) // ["aaaaaa"]
"?"(懶惰)重復(fù)零次或一次,懶惰量詞使用另一種方式匹配,它從目標(biāo)的起始位置開始嘗試匹配,每次檢查一個(gè)字符,并尋找它要匹配的內(nèi)容,如此循環(huán)直到字符結(jié)尾處。如:"aaaaaa".match(/a?/) // ["a"]
"+"(占有)重復(fù)零次或更多次,占有量詞會(huì)覆蓋事個(gè)目標(biāo)字符串,然后嘗試尋找匹配內(nèi)容 ,但它只嘗試一次,不會(huì)回溯。如:
"aaaaaa".match(/a+/) // ["aaaaaa"]
"{n}" 重復(fù)n次;如:
"aaaaaa".match(/a{3}/) // ["aaa"]
"{n,m}" 重復(fù)n到m次;如:
"aaaaaa".match(/a{3,4}/) // ["aaaa"]
"{n,}" 重復(fù)n次或更多次;如:
"aaaaaa".match(/a{3,}/) // ["aaaaaa"]
"*?" 重復(fù)任意次,但盡可能少重復(fù);如:"aabab".match(/a.*?b/) // ["aab"] 為什么第一個(gè)匹配是aab(第一到第三個(gè)字符)而不是ab(第二到第三個(gè)字符)?簡(jiǎn)單地說(shuō),因?yàn)檎齽t表達(dá)式有另一條規(guī)則,比懶惰/貪婪規(guī)則的優(yōu)先級(jí)更高:最先開始的匹配擁有最高的優(yōu)先權(quán)。
"+?" 重復(fù)1次或更多次,但盡可能少重復(fù),與上面一樣,只是至少要重復(fù)1次。如:"aabab".match(/a.+?b/) // ["aab"]
"??" 重復(fù)0次或1次,但盡可能少重復(fù)。如:"aabab".match(/a.??b/) // ["aab"]
"{n,m}?" 重復(fù)n到m次,但盡可能少重復(fù)。如:"aaa".match(/a{1,3}?/) // ["a"]
"{n,}?" 重復(fù)n次以上,但盡可能少重復(fù)。如:"aaa".match(/a{1,}?/) // ["a"]
2.2.2 處理選項(xiàng)javascript中正則表達(dá)式支持的正則表達(dá)式有三個(gè),g、i、m,分別代表全局匹配、忽略大小寫、多行模式。三種屬性可以自由組合共存。
在默認(rèn)的模式下,元字符 ^ 和 $ 分別匹配字符串的開頭和結(jié)尾處,模式 m 改變了這倆元字符的定義,讓他們匹配一行的開頭和結(jié)尾。
三、正則進(jìn)階 3.1 捕獲分組正則表達(dá)式一個(gè)最重要的特性就是將匹配成功的模式的某部分進(jìn)行存儲(chǔ)供以后使用這一能力。對(duì)一個(gè)正則表達(dá)式模式或部分模式兩邊添加圓括號(hào)將導(dǎo)致這部分表達(dá)式存儲(chǔ)到一個(gè)臨時(shí)緩沖區(qū)中。(可以使用非捕獲元字符 "?:", "?=", 或 "?!" 來(lái)忽略對(duì)這部分正則表達(dá)式的保存。)
所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左至右所遇到的內(nèi)容存儲(chǔ)。存儲(chǔ)子匹配的緩沖區(qū)編號(hào)從 1 開始,連續(xù)編號(hào)直至最大 99 個(gè)子表達(dá)式。每個(gè)緩沖區(qū)都可以使用 "n" 訪問(wèn),其中 n 為一個(gè)標(biāo)識(shí)特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)。
后向引用一個(gè)最簡(jiǎn)單,最有用的應(yīng)用是提供了確定文字中連續(xù)出現(xiàn)兩個(gè)相同單詞的位置的能力。舉個(gè)例子:
/([a-zA-Z]+)s+1/.exec(" asd sf hello hello asd"); //["hello hello", "hello"]
解釋這個(gè)例子:
1、(b[a-zA-Z]+b) 是一個(gè)捕獲分組,它捕獲所有的單詞,
" asd sf hello hello asd".match(/([a-zA-Z]+)/g) // ["asd", "sf", "hello", "hello", "asd"]
注:加上/g這個(gè)處理選項(xiàng)是便于我理解,沒(méi)有這個(gè)選項(xiàng)的時(shí)候,只輸出第一個(gè)單詞asd。
2、s加了一個(gè)空格限制條件,所以最后一個(gè)單詞被排除,
" asd sf hello hello asd".match(/([a-zA-Z]+)s/g) ["asd ", "sf ", "hello ", "hello "]
3、"1"后向引用,
" asd sf hello hello asd".match(/([a-zA-Z]+)s+1/g) ["hello hello"]
說(shuō)實(shí)話,這個(gè)例子花了我很長(zhǎng)時(shí)間去理解,有一點(diǎn)點(diǎn)想通,感覺(jué)這個(gè)概念看起來(lái)容易,寫起來(lái)并不容易啊。
3.2 捕獲分組常有的用法(斷言)"(exp)" 匹配exp,并捕獲文本到自動(dòng)命名的組里;如:
/(hello)sworld/.exec("asdadasd hello world asdasd") // ["hello world", "hello"]
"(?:exp)" 匹配exp,不捕獲匹配的文本,也不給此分組分配組號(hào);如:
/(?:hello)sworld/.exec("asdadasd hello world asdasd") // ["hello world"]
"(?=exp)" 用來(lái)捕獲exp前面的字符,分組中的內(nèi)容不會(huì)被捕獲,也不分配組號(hào);如:
/hellos(?=world)/.exec("asdadasd hello world asdasd") // ["hello "]
"(?!exp)" 捕獲后面不是exp的字符,同樣不捕獲分組的內(nèi)容,也不分配組號(hào);如:
/hellos(?!world)/.exec("asdadasd hello world asdasd") //null world改變一下: /hellos(?!world)/.exec("asdadasd hello wosrlds asdasd") //["hello "]
"(?
/(?!四、Javascript中正則表達(dá)式的使用 在JavaScript中定義一個(gè)正則表達(dá)式語(yǔ)法為:
var reg=/hello/ 或者 var reg=new RegExp("hello")接著列舉一下JavaScript中可以使用正則表達(dá)式的函數(shù),并簡(jiǎn)單介紹一下這些函數(shù)的作用。
4.1 String.prototype.search方法用來(lái)找出原字符串中某個(gè)子字符串首次出現(xiàn)的索引index,沒(méi)有則返回-1。可以在官方文檔中了解更多。
"abchello".search(/hello/); // 34.2 String.prototype.replace方法用來(lái)替換字符串中的子串。簡(jiǎn)單例子:
"abchello".replace(/hello/,"hi"); // "abchi"在官方文檔中有提到:
如果第一個(gè)參數(shù)是 RegExp對(duì)象,那么替換字符串可以插入特殊變量名$n,n是個(gè)小于100的非負(fù)整數(shù),表示插入第 n 個(gè)括號(hào)匹配的字符串。
所以我在文中一開始提到的需求就可以用
4.3 String.prototype.split方法
str.replace(/(.*?)/g, "") [$1表示/(.?)/g中的“(.?)”)匹配的字符串]
答案來(lái)解答。用來(lái)分割字符串
"abchelloasdasdhelloasd".split(/hello/); //["abc", "asdasd", "asd"]4.4 String.prototype.match方法用來(lái)捕獲字符串中的子字符串到一個(gè)數(shù)組中。默認(rèn)情況下只捕獲一個(gè)結(jié)果到數(shù)組中,正則表達(dá)式有”全局捕獲“的屬性時(shí)(定義正則表達(dá)式的時(shí)候添加參數(shù)g),會(huì)捕獲所有結(jié)果到數(shù)組中。
"abchelloasdasdhelloasd".match(/hello/); //["hello"] "abchelloasdasdhelloasd".match(/hello/g); //["hello","hello"]4.5 RegExp.prototype.exec方法和字符串的match方法類似,這個(gè)方法也是從字符串中捕獲滿足條件的字符串到數(shù)組中,但是也有兩個(gè)區(qū)別。
1、exec方法一次只能捕獲一份子字符串到數(shù)組中,無(wú)論正則表達(dá)式是否有全局屬性/hello/g.exec("abchelloasdasdhelloasd"); // ["hello"]2、正則表達(dá)式對(duì)象(也就是JavaScript中的RegExp對(duì)象)有一個(gè)lastIndex屬性,用來(lái)表示下一次從哪個(gè)位置開始捕獲,每一次執(zhí)行exec方法后,lastIndex就會(huì)往后推,直到找不到匹配的字符返回null,然后又從頭開始捕獲。 這個(gè)屬性可以用來(lái)遍歷捕獲字符串中的子串。
var reg=/hello/g; reg.lastIndex; //0 reg.exec("abchelloasdasdhelloasd"); // ["hello"] reg.lastIndex; //8 reg.exec("abchelloasdasdhelloasd"); // ["hello"] reg.lastIndex; //19 reg.exec("abchelloasdasdhelloasd"); // null reg.lastIndex; //04.6 RegExp.prototype.test方法用來(lái)測(cè)試字符串中是否含有子字符串
/hello/.test("abchello"); // true五、總結(jié)總算是對(duì)正則表達(dá)式了解了一些,要熟練掌握還需后面多多實(shí)踐^_^
參考資料:
1.http://www.cnblogs.com/zery/p...
2.http://www.cnblogs.com/tzyy/p...
3.http://www.codeyyy.com/regex/...A-Za-z0-9_ ?
abc ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92369.html
摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書問(wèn)世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對(duì)字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語(yǔ)言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來(lái)查找特定的信息(搜索),也可以用來(lái)查...
摘要:改為后,顯示出文件的大概大小,單位是或者或者默認(rèn)為,顯示的文件時(shí)間為時(shí)間。 這是 Nginx 學(xué)習(xí)總結(jié)的第三篇,上一篇介紹到了 Nginx 學(xué)習(xí)總結(jié)(2) —— 基本配置,這一篇會(huì)對(duì)Location 模塊 做一些總結(jié)。我們知道,Location 模塊 主要是用于針對(duì)某些特定的 URL 進(jìn)行配置,可以由前綴字符串定義,也可以由正則表達(dá)式定義。 Location 匹配規(guī)則 location...
摘要:首先推薦幾個(gè)正則表達(dá)式編輯器正則表達(dá)式是一種查找以及字符串替換操作。此表所列的常用正則表達(dá)式,除個(gè)別外均未在前后加上任何限定,請(qǐng)根據(jù)需要,自行處理。例如對(duì)而言,則采用一對(duì)引號(hào)來(lái)確定正則表達(dá)式的邊界。 這篇文章本來(lái)很早就要寫的,拖了挺久的,現(xiàn)在整理下,供大家學(xué)習(xí)交流哈! 基本概念 正則表達(dá)式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為元字符)。模式描述在搜...
摘要:用匹配的模式切割,第二個(gè)參數(shù)是限制返回結(jié)果的最大數(shù)量匹配規(guī)則字面量字符和元字符大部分字符在正則表達(dá)式中,就是字面的含義,比如匹配,匹配。它們叫做元字符,主要有以下幾個(gè)。相比之下,點(diǎn)號(hào)作為元字符是不包括換行符的。 1.概述 正則表達(dá)式(regular expression)是一種表達(dá)文本模式(即字符串結(jié)構(gòu))的方法。 創(chuàng)建方式有兩種方式: 一種是使用字面量,以斜杠表示開始和結(jié)束。 var ...
摘要:最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對(duì)字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語(yǔ)法在中使用正則表達(dá)式在中使 JS高級(jí)技巧 本篇是看的《JS高級(jí)程序設(shè)計(jì)》第23章《高級(jí)技巧》做的讀書分享。本篇按照書里的思路根據(jù)自己的理解和經(jīng)驗(yàn),進(jìn)行擴(kuò)展延伸,同時(shí)指出書里的一些問(wèn)題。將會(huì)討論安全的類型檢測(cè)、惰性載入函數(shù)、凍結(jié)對(duì)象、定時(shí)器等話題。1. 安全的類型檢測(cè)...
閱讀 2703·2021-11-25 09:43
閱讀 2085·2021-11-24 09:39
閱讀 1954·2021-11-17 09:33
閱讀 2750·2021-09-27 14:11
閱讀 1840·2019-08-30 15:54
閱讀 3224·2019-08-26 18:27
閱讀 1264·2019-08-23 18:00
閱讀 1810·2019-08-23 17:53