国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

正則表達(dá)式-基礎(chǔ)知識Review

Ajian / 3398人閱讀

摘要:正則表達(dá)式基礎(chǔ)知識正則表達(dá)式是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符竄來描述匹配一系列符合某個(gè)句法規(guī)則的字符竄。正則表達(dá)式的文本字符竄。第二個(gè)參數(shù)是正則表達(dá)式分組內(nèi)容,沒有分組則沒有該參數(shù)。

正則表達(dá)式-基礎(chǔ)知識Review

正則表達(dá)式(Regular Expression)是計(jì)算機(jī)科學(xué)的一個(gè)概念。 正則表達(dá)式使用單個(gè)字符竄來描述、匹配一系列符合某個(gè)句法規(guī)則的字符竄。 在很多文本編輯器里, 正則表達(dá)式通常用來被檢索替換哪些符合某個(gè)模式的文本。

創(chuàng)建

JavaScript通過內(nèi)置對象 RegExp支持正則表達(dá)式, 有兩種方式創(chuàng)建正則表達(dá)式對象, 如果我們想匹配字符竄中<%xxx%>兩個(gè)百分號分割的字符竄可以這么寫。

構(gòu)造函數(shù)

var regExp = new RegExp("<%[^%>]+%", "g");

字面量

var regExp = /<%[^%>]%>/g;

最后的g代表全局, 還有幾個(gè)修飾符

RegExp實(shí)例對象有五個(gè)屬性

g: global, 全文搜索,不添加的話搜索到第一個(gè)結(jié)果停止搜索。

i: ignore case, 忽略大小寫,默認(rèn)大小寫敏感。

m: multiple lines, 多行搜索。

lastIndex: 是當(dāng)前表達(dá)式模式首次匹配內(nèi)容中最后一個(gè)字符的下一個(gè)位置,每次正則表達(dá)式匹配成功匹配時(shí), lastIndex屬性值都會隨之改變。

sourse:正則表達(dá)式的文本字符竄。

除了正則表達(dá)式編譯為內(nèi)部格式從而使執(zhí)行更快的compile()方法, 對象還有兩個(gè)我們常用的方法。

元字符

正則表達(dá)式讓人望而卻步的一個(gè)重要原因就是轉(zhuǎn)譯字符太多, 組合非常多, 但是正則表達(dá)式的元字符(在正則表達(dá)式中具有特殊意義的專用字符,可以用來規(guī)定其前導(dǎo)字符)并不多

() [] {}  ^ $ | ? * + .

并不是每個(gè)元字符都有特定的意義,在不同的組合中元字符有不同的意義, 分類看一下

t 水平制表符 tab

r 回車符 carriage return

n 換行符 newline

f page feed 換頁符

cX 與X對應(yīng)的控制字符(Ctrl + X )

v 垂直制表符

0 空字符

字符類

一般情況下正則表達(dá)式一個(gè)字符(轉(zhuǎn)譯字符算一個(gè)) 對應(yīng)字符竄一個(gè)字符,表達(dá)式 abt 的含義

ab水平制表符

但是我們可以使用元字符[]來構(gòu)建一個(gè)簡單的類, 所謂類是指,符合某些特征的對象, 是一個(gè)泛指,而不是特指某個(gè)字符了, 我們可以使用表達(dá)式[abc], 把字符a或b或c歸為一類,表達(dá)式可以匹配這類的字符。

字符類取反

元字符[]組合可以創(chuàng)建一個(gè)類,我們還可以使用元字符^創(chuàng)建反向類/負(fù)向類,反向類的意思是不屬于XXX類的內(nèi)容, 表達(dá)式1表示不是字符a或b或c的內(nèi)容。

范圍類

按照上面的說明如果希望匹配單個(gè)數(shù)字那么表達(dá)式是這樣的

[0123456789]

如果是字母那么。。。 好麻煩, 正則表達(dá)式還提供了范圍類,我們可以使用x-y來連接兩個(gè)字符表示從x到y(tǒng)的任意字符, 這是個(gè)閉區(qū)間, 也就是說包含x和y本身, 這樣匹配小寫字母就很簡單了。

[a-z]
預(yù)定義類

剛才使用正則我們創(chuàng)建了幾個(gè)類,來表示數(shù)字,字母等,但這樣寫很麻煩,正則表達(dá)式為我們了幾個(gè)常用的預(yù)定義類來匹配常見的字符。

字符 等價(jià)類 含義
. [^rt] 除了回車符和換行符之外的所有字符
d [0-9] 數(shù)字字符
D [^0-9] 數(shù)字字符
s [ x0Bf ] 空白符
S [^t x0Bf ] 非空白符
w [a-zA-Z_0-9] 字母,數(shù)字,下劃線
W [^a-zA-Z_0-9] 非字母,數(shù)字,下劃線

有了這些預(yù)定義類, 寫一些正則就很方便了, 比如我們希望匹配一個(gè) ab + 數(shù)字 + 任意字符的字符竄, 就可以寫了abd.

可以把正則表達(dá)式,想象成一種模式,字符竄匹配正則表達(dá)式定義的模式的結(jié)果

string.match(regExpPattern)
邊界

正則表達(dá)式還提供了幾個(gè)常用的邊界匹配字符。

字符 含義
^ 以xxx開頭, ^ 開頭的匹配參照對象是整個(gè)字符竄
$ 以xxx結(jié)尾, $ 結(jié)尾的匹配參照對象也是整個(gè)字符竄
b 單詞邊界, "-"也是單詞邊界!
B 非單詞邊界
^ 開頭的匹配參照對象是整個(gè)字符竄,
$ 結(jié)尾的匹配參照對象也是整個(gè)字符竄,
限制的是整個(gè)字符竄。

var regExpPattern = /^hdm/g;
"h2m h4m h2m".match(regExpPattern); // h2m, 記住這是以整個(gè)字符竄去匹配的

//同理

var regExpExpPattern = /hdm$/g;
"h2m h4m h4m".match(regExpPattern); // h4m

//使用場景 手機(jī)號匹配

"13423454234".match(/^1d{10}$/g)

量詞

之前,介紹的方法都是一一匹配,如果希望匹配一個(gè)連續(xù)20次數(shù)字的字符竄難道我們需要寫成這樣?

ffffdffffdffffdffffdffffdffffdffffddd..

為此正則表達(dá)式引入了一些量詞

字符 含義
? 出現(xiàn)零次或一次(最多出現(xiàn)一次)
+ 出現(xiàn)一次或多次(至少出現(xiàn)一次)
* 出現(xiàn)零次或多次(任意次)
{n} 出現(xiàn)n次
{n,m} 出現(xiàn)n到m次
{n,} 至少出現(xiàn)n次
{,m} 最多出現(xiàn)m次
var regExp = /w+Bryon/

regExp.test("hi Bryon"); // true

regExp.test("Welcome Byron"); // true

regExp.test("Byron"); //false


//匹配帶有3到1個(gè)小數(shù)的數(shù)字
var reg = /d+.d{1,3} 
貪婪模式與非貪婪模式

看了量詞的介紹,也許愛思考的同學(xué)會想到關(guān)于匹配原則的一些問題, 比如{3,5} 這個(gè)量詞, 要是在句子中出現(xiàn)了十次, 那么他是每次匹配三個(gè)還是五個(gè),反正3,4,5都滿足3~5的條件。

量詞在默認(rèn)下是盡可能多的匹配的,也就是大家常說的貪婪模式。

// ["12345","6789"];
"12345679".match(/d{3,5}/g); 

既然有貪婪模式,那么肯定會有非貪婪模式,讓正則表達(dá)式盡可能少的匹配,u額就是說一旦成功匹配不再繼續(xù)嘗試,做法很簡單, 在量詞后加上?即可

//["123","456","789"]

"123456789".match(/d{3,5}?/g);
分組

有時(shí)候希望使用量詞的時(shí)候匹配多個(gè)字符,而不是像上面例子只是匹配一個(gè),比如希望匹配Byron出現(xiàn)20次的字符竄,寫成Byron{20}的話匹配的是Byro+n出現(xiàn)20次。

//寫成Byron{20}的話匹配的是Byro+n出現(xiàn)20次。
/Byron{20}/g

怎么把Byron作為一個(gè)整體呢? 使用()就可以達(dá)到此目的,在正則中成為分組。

//分組在regExp.exec(stringObj)中會多帶帶顯示在返回結(jié)果中。

(Byron){20}

或 |

如果希望匹配Byron或Casper出現(xiàn)20次該怎么辦呢? 可以使用字符| 達(dá)到或的功效

(Byron|Casper){20}

使用分組的正則表達(dá)式會把匹配項(xiàng)也放到分組中,默認(rèn)是按數(shù)字編號分發(fā)的,可以根據(jù)編號獲得捕獲的分組內(nèi)容,這在一些希望具體操作第幾個(gè)匹配項(xiàng)的函數(shù)中很有用。

// Group 1 : Byron , Group 2: ok
(Byron).(ok)

分組嵌套

如果有分組嵌套的情況,外面的組的編號靠前

// group 1: (^|%>)[^	]*, Group 2: (^|%>)
((^|%>)[^	]*)

忽略分組

有時(shí)候我們不希望捕獲某些分組,只需要在分組內(nèi)加上?: 就可以了, 這并不意味著該分組內(nèi)容不屬于正則表達(dá)式,只是不會給這個(gè)分組加編號而已。

(?:Bryon).(ok)
前瞻
表達(dá)式 含義
exp1(?=exp2) 匹配后面是exp2的exp1
exp1(?!exp2) 匹配后面不是exp2的exp1
var regExp = /good(?=Byron)/;

regExp.exec("goodByron123"); // ["good"]
regExp.exec("goodCapser123"); // null

通過上面例子可以看出exp1(?=exp2)表達(dá)式, 但只有其后面內(nèi)容是exp2的時(shí)候才會匹配,也就是兩個(gè)條件,exp1(?!exp2)比較類似。

正則表達(dá)式相關(guān)的方法

RegExp.prototype.test(str)

該方法用于測試字符竄參數(shù)中是否匹配正則表達(dá)式模式,如果存在則返回true,否則返回false。

var reg = /d+.d{1,2}$/g;

reg.test("123.45"); // true
reg.test("0.2");  // true

reg.test("a.34"); //false
reg.test("34.5678"); //false
//判斷手機(jī)號是否正確
function isPhoneNum(phoneNum) {
    var phoneNumberTester = /^1d{10}$/;
    return phoneNumberTester.test(phoneNum);
}

RegExp.prototype.exec(str)

該方法用于正則表達(dá)式模式在字符竄中運(yùn)行查找,如果exec()找到匹配的文本,則返回一個(gè)結(jié)果,否則返回null

除了數(shù)組元素和length屬性之外, exec()方法返回對象還包括兩個(gè)屬性。

index屬性聲明的是匹配文本的第一個(gè)字符的位置。

input屬性則存放的是被檢索的字符竄string。

非全局調(diào)用

調(diào)用非全局的RegExp對象的exec()時(shí),返回?cái)?shù)組的第一個(gè)元素是與正則表達(dá)式相匹配的文本,第二個(gè)元素是與RegExpObject的第一個(gè)子表達(dá)式相匹配的文本(如果有的話), 第三個(gè)元素時(shí)與RegExp對象的第二個(gè)子表達(dá)式相匹配的文本(如果有的話),以此類推。

全局調(diào)用

調(diào)用全局的RegExp對象的exec()時(shí),它會在RegExp實(shí)例的lastIndex屬性指定的字符處開始檢索字符竄string

當(dāng)exec()找到了與表達(dá)式相匹配的文本時(shí), 在匹配后, 它將把RegExp實(shí)例的lastIndex屬性設(shè)置為匹配文本的最后一個(gè)字符的下一個(gè)位置。可以通過反復(fù)調(diào)用exec()方法來遍歷字符竄中的所有哦匹配文本。

當(dāng)exec()再也找不到匹配的文本時(shí),它將返回null,并把lastIndex屬重置為0。

var reg = /d/g;

var r =  reg.exec("a1b2c3");

console.log(r);

console.log(reg.lastIndex); // 2

r = reg.exec("a1b2c3");

console.log(reg.lastIndex); // 4
var reg = /d/g;

while (r = reg.exec("a1b2c3")) {
    console.log(r.index + ":" + r[0])
}

//1:1 , 3:2, 5:3

String.prototype.search(reg)

search()方法用于檢索字符竄中指定的子字符串,或檢索與正則表達(dá)式相匹配的子字符竄。

search()方法不執(zhí)行全局匹配,它將忽略標(biāo)志g, 它同時(shí)忽略正則表達(dá)式對象的lastIndex屬性,并且總是從字符竄的開始進(jìn)行檢索,這意味著它總是返回字符竄的第一個(gè)匹配的位置。

String.prototype.match(reg)

match()方法將檢索字符竄,以找到一個(gè)或多個(gè)與regexp匹配的文本。但regexp是否具有標(biāo)志g對結(jié)果影響很大。

非全局調(diào)用

如果regexp沒有標(biāo)志g,那么match()方法就只能在字符竄中執(zhí)行一次匹配。如果沒有找到任何匹配的文本,match()將返回null。否則它將返回一個(gè)數(shù)組,其中存放了與它找到的匹配文本有關(guān)的信息。

該數(shù)組的第一個(gè)元素存放的是匹配文本,而其余的元素存放的是與正則表達(dá)式的子表達(dá)式匹配的文本。除了這些常規(guī)的數(shù)組元素之外,返回的數(shù)組還含有兩個(gè)對象屬性。

index屬性聲明的是匹配文本的起始字符在字符竄中的位置。

input屬性聲明的是對stringObject的引用。

String.prototype.replace(reg, replaceStr|| function callback())

關(guān)于string對象的replace方法, 我們最常用的是傳入兩個(gè)字符竄的做法,但這種做法有個(gè)缺陷,只能replace一次。

"abcabcabc".replacce("bc", "X") //aXabcabc

replace方法的第一個(gè)參數(shù)還可以傳入RegExp對象,傳入正則表達(dá)式可以使replace方法更加強(qiáng)大靈活

"abcabcabc".replace(/bc/g, "X"); //aXaXaX
"abcabcabc".replace(bc/gi, "X"); // aXaXaX

如果replace方法的第一個(gè)參數(shù)傳入的是帶分組的正則表達(dá)式,我們在第二個(gè)參數(shù)中可以使用$1...$9來獲取相應(yīng)分組內(nèi)容, 比如希望把字符竄1<%2%>34>%567%>89的<%x%>換為$#x#$, 我們可以這樣

"1<%2%>34>%567%>89的<%x%>".replace(/<%(d+)%>)/g, "@#$1#@");
// 1@#2#@34@#567#@89

當(dāng)然還有很多方式可以達(dá)到這一目的,這里只是演示一下利用分組內(nèi)容,我們在第二個(gè)參數(shù)中使用@#$1#@, 其中$1表示被捕獲的分組內(nèi)容弄, 在一些js模板函數(shù)中可以經(jīng)常見到這種方式替換字符竄。

可以通過修改replace方法的第二個(gè)參數(shù),使replace更加強(qiáng)大,在前面的介紹中,只能把所有匹配替換為固定內(nèi)容,但如果我希望把一個(gè)字符竄中所有數(shù)字,都用小括號包起來該怎么弄?

"2398sdadads1smdsa3mmm23mmmbb".replace(/d+/g, function(matchedStr, groupContent$, index, strObj ) {
    return "(" + matchedStr + ")";
})

把replace方法的第二個(gè)參數(shù)傳入一個(gè)function,這個(gè)function會在每次匹配替換的時(shí)候調(diào)用,算是個(gè)每次替換的回調(diào)函數(shù),我們使用了回調(diào)函數(shù)的第一個(gè)參數(shù),也就是匹配內(nèi)容,其實(shí)回調(diào)函數(shù)一共有四個(gè)參數(shù)。

第一個(gè)參數(shù)很簡單,是匹配字符竄。

第二個(gè)參數(shù)是正則表達(dá)式分組內(nèi)容,沒有分組則沒有該參數(shù)。

第三個(gè)參數(shù)是匹配項(xiàng)在字符竄中的index。

第四個(gè)參數(shù)則是原字符竄。

例子

"2398rsjdhahd2131kksdajdj23".replace(/d+/g, function(matchedSubStr,index, strObj) {
    console.log(matchedSubStr + "	" + index + "	" + strObj);
    return "(" + matchedSubStr +")";
})

//2398 0    2398rsjdhahd2131kksdajdj23    
//2131 12    2398rsjdhahd2131kksdajdj23    
//23 24 2398rsjdhahd2131kksdajdj23    

這是沒有分組的情況,打印出來的分別是匹配內(nèi)容、匹配項(xiàng)index和原字符竄,看個(gè)有分組的。

"<%1%><%2%><%3%>".replace(/<%([^%>]+)%>/g, function(matchedStr, group, index, thisStrObj) {
    console.log(matchedStr + "	" + group + "	" + index + "	" + thisStrObj);
    return group;
})

//<%1%>    1    0    <%1%><%2%><%3%>
//<%2%>    2    5    <%1%><%2%><%3%>
//<%3%>    3    10    <%1%><%2%><%3%>
//"123"

String.prototype.split(reg)

使用split方法把字符竄分割為字符數(shù)組

"a,b,c,d".split(",");
// ["a","b","c","d"]

和replace方法類似,在一些復(fù)雜的分割情況下我們可以使用正則表達(dá)式解決

"a1b2c3d".split(/d/); // ["a","b","c","d"]
  • abc ?

  • 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98171.html

    相關(guān)文章

    • 豆瓣閱讀報(bào)告生成器

      摘要:是一個(gè)自動(dòng)根據(jù)你的豆瓣讀書標(biāo)記生成讀書報(bào)告的腳本。動(dòng)機(jī)我自己自己是一個(gè)重度豆瓣讀書用戶注意這里要區(qū)分豆瓣讀書和豆瓣閱讀的區(qū)別。豆瓣授權(quán)由于要讀用戶的豆瓣數(shù)據(jù),那么就要接入豆瓣的,那么就要先向豆瓣申請授權(quán)。 DouBanReader是一個(gè)自動(dòng)根據(jù)你的豆瓣讀書標(biāo)記生成讀書報(bào)告的腳本。適用對象是像我這種豆瓣讀書的重度用戶,會在豆瓣上標(biāo)記自己讀過的每一本書,并且會很負(fù)責(zé)地打分與寫review。...

      Simon 評論0 收藏0
    • 翻譯_20行代碼創(chuàng)造JavaScript模板引擎(一)

      摘要:翻譯行代碼創(chuàng)造模板引擎一想看博客原文鏈接,請點(diǎn)擊下方一個(gè)非常好用的學(xué)習(xí)正則表達(dá)的網(wǎng)站正則表達(dá)式圖文解說網(wǎng)站譯文事情的起因,我想編寫一個(gè)邏輯簡單的模板引擎,它可以很好滿足我現(xiàn)在的需求。,表示全局匹配。 翻譯_20行代碼創(chuàng)造JavaScript模板引擎(一) 想看博客原文鏈接,請點(diǎn)擊下方 JavaScript template engine in just 20 lines 一個(gè)非常好用...

      hiyang 評論0 收藏0
    • 用Python爬取了幾千條相親文案,終于發(fā)現(xiàn)了告別單身的秘密

      摘要:寫在最后近年來,隨著人們思想觀念的改變,相親也逐漸得到年輕人的接受與認(rèn)可,特別是對于那些圈子比較窄,接觸不到異性的人而言。 前不久,小編刷到這樣一條短視頻,1.7億...

      keke 評論0 收藏0
    • 從 WTForm 的 URLXSS 談開源組件的安全性

      摘要:能夠開發(fā)開源組件的開發(fā)者本身素質(zhì)相對較高,代碼質(zhì)量較高,也使開源組件出漏洞的可能性較小。這種對比明顯反應(yīng)出開源組件和開源應(yīng)用在安全漏洞關(guān)注度上的差距。另一個(gè)例子,我們通過修改邏輯運(yùn)算符改變開發(fā)者正常的判斷流程,造成安全問題。 開源組件是我們大家平時(shí)開發(fā)的時(shí)候必不可少的工具,所謂『不要重復(fù)造輪子』的原因也是因?yàn)椋罅糠庋b好的組件我們在開發(fā)中可以直接調(diào)用,減少了重復(fù)開發(fā)的工作量。開源組件和...

      lordharrd 評論0 收藏0
    • 為了30分鐘配送,盒馬工程師都有哪些“神操作”?

      摘要:阿里妹導(dǎo)讀提到盒馬鮮生,除了新鮮的大龍蝦以外,大家印象最深的就是快速配送門店附近公里范圍內(nèi),分鐘送貨上門。系統(tǒng)異常業(yè)務(wù)異常的處理,上線時(shí)門店灰度方案一個(gè)門店出問題,不影響整個(gè)盒馬門店,緩存機(jī)制柔性可用重試機(jī)制事務(wù)處理串并行打日志等等。 showImg(https://segmentfault.com/img/remote/1460000018587196); 阿里妹導(dǎo)讀:提到盒馬鮮生...

      Me_Kun 評論0 收藏0

    發(fā)表評論

    0條評論

    最新活動(dòng)
    閱讀需要支付1元查看
    <