摘要:而在下,僅僅是喜歡這個(gè)數(shù)字,如是而已正則表達(dá)式正則表達(dá)式,又稱規(guī)則表達(dá)式。對(duì)象在爪洼死苦瑞特中,對(duì)象表示正則表達(dá)式,它是對(duì)字符串執(zhí)行模式匹配的強(qiáng)大工具。序列匹配,而則匹配。否則,將視為一個(gè)原義的字符。注意正則表達(dá)式會(huì)匹配全角空格符。
寫在最前面
看到標(biāo)題你可能會(huì)疑惑為什么不是30分鐘?
因?yàn)槲疫@個(gè)文章圖文并茂,非??植?,兄弟,其實(shí)你不用30分鐘就可以看懂。
你可能會(huì)以為我在吹牛B,但是當(dāng)你看完的時(shí)候,一掐表,你會(huì)發(fā)現(xiàn)
我真的是在吹牛B
那又為什么是.22呢?
作為一個(gè)理科生,保留兩位小數(shù)是不變的信仰。
而在下,僅僅是喜歡2這個(gè)數(shù)字,如是而已
正則表達(dá)式,又稱規(guī)則表達(dá)式。(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式通常被用來(lái)檢索、替換、校驗(yàn)?zāi)切┓夏硞€(gè)模式(規(guī)則)的文本。
RegExp對(duì)象在爪洼死苦瑞per特中,RegExp 對(duì)象表示正則表達(dá)式,它是對(duì)字符串執(zhí)行模式匹配的強(qiáng)大工具。
那么要如何使用呢?
兩種方式:字面量,構(gòu)造函數(shù)
var reg = /hello/g //字面量 // 代表單詞邊界(WordBoundary) 也就是說(shuō)這個(gè)正則匹配的是 hello world這種hello 而不是helloworld //因?yàn)閔elloworld連起來(lái)了,沒(méi)有單詞邊界
var reg = new RegExp("hello","g") //注意兩者的區(qū)別 //后面這種方法需要轉(zhuǎn)義反斜杠(javascript的原因), //而且這個(gè)g(修飾符,全局匹配)是多帶帶提取出來(lái)的 //而且正則兩邊沒(méi)有/包圍的,上面第一種是這樣的=> /正則表達(dá)式/正則可視化工具
Regulex
可視化圖形,對(duì)理解正則有非常大的幫助
二話不說(shuō)先進(jìn)來(lái)這個(gè)網(wǎng)站,這個(gè)文章將使用這個(gè)網(wǎng)站來(lái)驗(yàn)證寫的例子。
正則表達(dá)式由兩種基本字符類組成
原義字符
元字符
原義字符,就是表示原本意思的字符,像上面正則中的hello,就代表匹配hello這個(gè)字符串
元字符呢,就是表示不是原本意思的字符,這樣想就簡(jiǎn)單多了吧。像上面這個(gè)
既然元字符表示的不是本身的字符,那我如果就要匹配它原本的字符呢?比如說(shuō)我就要匹配+號(hào),*號(hào),那么請(qǐng)使用 來(lái)轉(zhuǎn)義字符
下面這些元字符先隨便過(guò)一遍先,不用背熟也可往下看~
$ 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹配 "n" 或 "r"。要匹配 $ 字符本身,請(qǐng)使用 $。
() 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使用。要匹配這些字符,請(qǐng)使用 ( 和 )。
* 匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請(qǐng)使用 *。
+ 匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,請(qǐng)使用 +。
. 匹配除換行符 n 之外的任何單字符。要匹配 . ,請(qǐng)使用 . 。
[] 標(biāo)記一個(gè)中括號(hào)表達(dá)式的開始。要匹配 [,請(qǐng)使用 [。
{} 標(biāo)記限定符表達(dá)式的開始。要匹配 {,請(qǐng)使用 {。
| 指明兩項(xiàng)之間的一個(gè)選擇。要匹配 |,請(qǐng)使用 |。
? 匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請(qǐng)使用 ?。
將下一個(gè)字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符。例如, "n" 匹配字符 "n"。"n" 匹配換行符。序列 "" 匹配 "",而 "(" 則匹配 "("。
^ 匹配輸入字符串的開始位置,除非在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合。要匹配 ^ 字符本身,請(qǐng)使用 ^。
cX 匹配由x指明的控制字符。例如, cM 匹配一個(gè) Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 "c" 字符。
f 匹配一個(gè)換頁(yè)符。等價(jià)于 x0c 和 cL。
匹配一個(gè)換行符。等價(jià)于 x0a 和 cJ。
匹配一個(gè)回車符。等價(jià)于 x0d 和 cM。
s 匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ fnrtv]。注意 Unicode 正則表達(dá)式會(huì)匹配全角空格符。
S 匹配任何非空白字符。等價(jià)于 1。
匹配一個(gè)制表符。等價(jià)于 x09 和 cI。
v 匹配一個(gè)垂直制表符。等價(jià)于 x0b 和 cK
邊界從一開始的例子我們就知道了這個(gè)b,不對(duì),是這個(gè)
他表示的就是單詞邊界的意思.
我們知道,f*ck這個(gè)是有很多用法的,可以多帶帶用,也可以加個(gè)ing多種詞性使用。
然后我們只想找到多帶帶的f*ck,看代碼
//作為光榮的社會(huì)主義接班人怎么可能用f*ck做例子呢? var reg = /is/g; var str = "this is me"; str.replace(reg,"X") //"this X me"
var reg = /is/g; var str = "this is me"; str.replace(reg,"X") //"thX X me"
兩者區(qū)別清晰可見(jiàn),不容我多說(shuō)了吧,各位客官。
再來(lái)看看一個(gè)問(wèn)題,如果我只要開頭部分的A字符而文本中間的A字符卻不要,又該如何?
只需如此,便可對(duì)敵
var reg = /^A/g; var str = "ABA"; str.replace(reg,"X"); //"XBA"
需要以A為結(jié)尾的正則,則是如下
var reg = /A$/g; var str = "ABA"; str.replace(reg,"X"); //"ABX"
注意,正如開頭結(jié)尾的位置一樣,^和$的位置也是如此,^放在正則表達(dá)式前面,$放在表達(dá)式后面
字符類一般情況下,正則表達(dá)式一個(gè)字符對(duì)應(yīng)字符串的一個(gè)字符
比如表達(dá)式 hello 就表示 匹配 字符 h e l l o,
如果我們想要匹配一類字符的時(shí)候?
比如我要匹配a或者b或者c,我們就可以使用元字符 []來(lái)構(gòu)建一個(gè)簡(jiǎn)單的類
[abc]就把a(bǔ),b,c歸為一類,表示可以匹配a或者b或者c。
如果你會(huì)一丟丟英文的話,你應(yīng)該就可以看懂下面的圖,one of abc,也就是匹配abc中任意一個(gè)~
當(dāng)我們學(xué)習(xí)了上面的內(nèi)容以后,如果我們要寫匹配0到9的數(shù)字,就應(yīng)該是這樣寫
但是如果我要匹配更多呢?那不是鍵盤都要敲爛了?這正則也太不智能了吧???
顯然,你能想到的,創(chuàng)造正則的人也想到了
我們可以這樣子
好了,方便了一些,然后你可能又會(huì)吃驚,那么我的短橫線-呢?我如果要匹配0-9以及短橫線呢?
莫慌,只要在后面補(bǔ)回去即可
這個(gè)圖可以清楚看到有兩條分支,也就是說(shuō)我可以走0-9這條路也可以走短橫線這條路
學(xué)習(xí)了上面以后,我們就可以書寫匹配數(shù)字的正則了,[0-9]
那么有沒(méi)有更簡(jiǎn)便更短的方法呢?
巧了,正則就是辣么強(qiáng)大
在上面的元字符部分內(nèi)容中,你可能已經(jīng)窺得其中精妙了
上表格,不是,上圖(這個(gè)segmentfault哪里插入表格?。浚浚?/p>
我們可以根據(jù)英文單詞的意思,來(lái)記住這些預(yù)定義類的用法。
我們發(fā)現(xiàn),大寫字母和小寫字母的區(qū)別就是取反!,如d和D
同時(shí)我們從表格中的等價(jià)類可以發(fā)現(xiàn)如果我們要一個(gè)類的取反,那么就在類中加一個(gè) ^
none of abc
如果要你寫一個(gè)匹配10個(gè)數(shù)字的正則?你會(huì)怎么寫
誒~你可能已經(jīng)胸有成竹的寫下了
ffffdffffdffffdd
吃驚,你會(huì)發(fā)現(xiàn),盡管是你單身二十余年的右手,依然感到了一絲乏力!
疲憊,有時(shí)是在過(guò)度勞累之后
為了挽救一些人的右臂,正則有了量詞
實(shí)現(xiàn)上面的需求我們只要 d{10}
Digit 10times
為了方便一些英語(yǔ)不好的人,比如我,我甚至使用了鮮為人知的百度翻譯(廣告費(fèi)私我)
但是,如果我不知道要匹配具體多少個(gè)數(shù)字呢?反正就是匹配100個(gè)到1000個(gè)之間的數(shù)字
當(dāng)當(dāng)當(dāng)當(dāng)~
讓我們看看可視化工具的結(jié)果,方便理解
注意,這個(gè){n,m}是包括n次和m次的哦,是閉區(qū)間哦
貪婪模式與非貪婪模式從上面一則我們知道,如果我們要匹配100到1000個(gè)數(shù)字的話,是這樣寫
d{100,1000}
如果我給的字符串里有1000個(gè)數(shù)字,但是我只想匹配前面100個(gè)呢?
如果按照上面這樣寫,則如下
var reg = /d{3,6}/; var str = "123456789"; str.replace(reg,"替換成這個(gè)"); //"替換成這個(gè)789"
我們可以看到,上面這個(gè)例子是匹配了6個(gè)數(shù)字,將6個(gè)數(shù)字替換了,盡管他的正則匹配的是3到6個(gè)數(shù)字。
沒(méi)錯(cuò),它是貪婪的!它會(huì)盡可能地匹配更多!
這就是正則的 貪婪匹配,這是默認(rèn)的,如果我們不想要那么貪婪,如何變得容易滿足一點(diǎn)?
只需要在量詞后面加上 ? 即可
var reg = /d{3,6}?/; var str = "123456789"; str.replace(reg,"替換成這個(gè)"); //"替換成這個(gè)456789"
可以清楚看到正則只匹配了前面3個(gè)數(shù)字~這就是正則的非貪婪模式
分支條件如果我只需要匹配100個(gè)或者1000個(gè)數(shù)字呢?
就只有100和1000兩種可能,而不是100到1000任意一個(gè)數(shù)字,又該如何對(duì)敵?
這就要設(shè)計(jì)到正則的分支條件了
d{100}|d{1000}
需要注意的是這個(gè) | 分割的是左右兩邊所有部分,而不是僅僅連著這個(gè)符號(hào)的左右兩部分,看下圖
有時(shí)候我們只需要一部分是分支,后面走的是同一條主干,只需要把分支用()包含即可
注意:這個(gè)匹配是從正則左邊的分支條件開始的,如果左邊滿足了,那么右邊就不會(huì)在對(duì)比!
var reg = /d{4}|d{2}/ var str = "12345" str.replace(reg,"X"); // "X5"
var reg = /d{2}|d{4}/ var str = "12345" str.replace(reg,"X"); //"X345"前瞻/后顧
sometimes,我們要找尋的字符可能還要依靠前后字符來(lái)確定
比如說(shuō)我要替換連續(xù)的2個(gè)數(shù)字,而且它的前面要連著是2個(gè)英文字母,這樣的數(shù)字我才要
你可能會(huì)疑惑,這樣寫不就完事了嗎?
d{2}w{2}
上面匹配的是2個(gè)數(shù)字和2個(gè)字母,雖然是連著的,但是匹配了是4個(gè)字符,如果我要替換匹配文本的話,那就替換了4個(gè)字符,而我們只想替換2個(gè)數(shù)字!
這個(gè)時(shí)候就需要用到斷言了
首先我們需要明白幾個(gè)點(diǎn)
正則表達(dá)式從文本頭部到尾部開始解析,文本尾部方向叫做‘前’,也就是往前走,就是往尾巴走
前瞻就是正則表達(dá)式匹配到規(guī)則(此例中的‘2個(gè)數(shù)字’)的時(shí)候,向前看看,看看是否符合斷言(此例中的‘前面連著2個(gè)字母’),后瞻/后顧的規(guī)則則相反。(javascript不支持后顧)
上表格!
根據(jù)表格內(nèi)容,我們就可以解決這個(gè)問(wèn)題了,注意w包括數(shù)字哦~題目要求是連著2個(gè)字母
var reg = /d{2}(?=[a-zA-Z]{2})/; var str = "1a23bc456def"; str.replace(reg,"X"); //"1aXbc456def"
只替換了數(shù)字,沒(méi)有替換后面的斷言哦!
順便把這個(gè)負(fù)向前瞻看看吧
看到這個(gè)not followed by 我想你應(yīng)該知曉用法了
分組當(dāng)我們要匹配一個(gè)出現(xiàn)三次的單詞而不是數(shù)字的時(shí)候,會(huì)怎么寫呢?
你可能會(huì)這樣寫
hello{3}
然后你打開可視化工具
媽耶,居然只重復(fù)了我的o字母!死渣則,好過(guò)分
其實(shí),我們只要使用()就可以達(dá)到分組的目的,使量詞作用于分組,上面分支條件中的括號(hào)亦是如此
分組以后怎么使用分組內(nèi)容呢?
首先看一個(gè)問(wèn)題,如何匹配8個(gè)不連續(xù)的數(shù)字?
如果你不使用分組,你會(huì)發(fā)現(xiàn)根本無(wú)從下手,因?yàn)槟悴荒芘袛喑鲇袩o(wú)重復(fù)!
我們先公布答案,再來(lái)分析一波
首先,這個(gè)(?!負(fù)向前瞻斷言A)表達(dá)式B,這里使用的是負(fù)向前瞻,也就是說(shuō)斷言A前面的內(nèi)容(表達(dá)式B),不能符合表達(dá)式A,這個(gè)說(shuō)法很拗口,我嘴巴都拗不過(guò)來(lái)了。能聽(tīng)明白吧,這個(gè)設(shè)計(jì)就是,我這個(gè)斷言是“出現(xiàn)重復(fù)的數(shù)字”,然后表達(dá)式是“8個(gè)數(shù)字”,”8個(gè)數(shù)字“不能復(fù)合“出現(xiàn)重復(fù)的數(shù)字"
然后,這個(gè) .*(d).* 呢,是先找到一個(gè)在任意位置出現(xiàn)的數(shù)字,為什么是任意位置呢?因?yàn)槲覀兣袛嗟闹貜?fù)可能出現(xiàn)在任何位置;看上面的可視化也就可以明白,d前后有0-n個(gè)字符,所以說(shuō)他是任意位置的。
最關(guān)鍵的來(lái)了,這個(gè)1代表什么呢?仔細(xì)看你可以發(fā)現(xiàn),d加了一個(gè)括號(hào),這個(gè)括號(hào)就代表著分組,那么是幾號(hào)分組呢?第一個(gè)括號(hào)就是分組1(默認(rèn)情況下),如果還有第二個(gè)括號(hào),那就是分組2,前瞻的括號(hào)是不算的噢,而這個(gè)1呢就代表著引用這個(gè)分組1,使用2引用分組2。你也許會(huì)好奇,我引用它是相當(dāng)于在這個(gè)位置寫了一個(gè)d嗎?NOP,不僅僅這么簡(jiǎn)單,它引用的是這個(gè)d的內(nèi)容,也就是說(shuō)他會(huì)和d是一樣的值!這不就是重復(fù)了嗎?!??!這個(gè) .*(d).*1 就代表著任意位置出現(xiàn)了任意次數(shù)的重復(fù)
最后,我們把這些整合在一起就是,匹配8個(gè)數(shù)字不能出現(xiàn)任意的重復(fù)。(?!出現(xiàn)任意重復(fù))8個(gè)數(shù)字,因?yàn)檫@個(gè)(?!)是負(fù)向前瞻,所以。。。emmm。。這樣就理解了吧。
分組還有其他更詳細(xì)的內(nèi)容,但是篇幅有限,馬上就到30分鐘了。只好撿一些有價(jià)值常用的講了~
嘿嘿嘿正則就介紹到這里啦~
下篇文章將介紹javascript中的正則對(duì)象的屬性,以及一些方法。
29.22分鐘學(xué)會(huì)書寫正則(2)
如果有意見(jiàn)或者建議,請(qǐng)?jiān)谠u(píng)論區(qū)中指出,謝謝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99153.html
摘要:寫在前面的一些廢話沒(méi)有看過(guò)上一篇文章的盆友有福了今天沒(méi)錯(cuò)就是現(xiàn)在我將免費(fèi)免費(fèi)將上篇文章的鏈接發(fā)出來(lái)這里是上篇上回說(shuō)了怎么寫出正則,這次展示下在中使用正則的場(chǎng)景正則對(duì)象屬性的正則對(duì)象有以下幾個(gè)屬性,其中前面三個(gè)也叫修飾符也就是表達(dá)式兩條杠后面 寫在前面的一些廢話 沒(méi)有看過(guò)上一篇文章的盆友有福了! 今天!沒(méi)錯(cuò)!就是現(xiàn)在!我將免費(fèi)!all f*cking FREE! 免費(fèi)將上篇文章的鏈接發(fā)出...
摘要:正則表達(dá)式使用單個(gè)字符串來(lái)描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。接下來(lái),是在手機(jī)正則里面已經(jīng)出現(xiàn)了。序列匹配而則匹配。分組與反向引用分組,又稱為子表達(dá)式。把正則表達(dá)式拆分成小表達(dá)式。 本文轉(zhuǎn)載自網(wǎng)絡(luò)。轉(zhuǎn)載編輯過(guò)程中,可能有遺漏或錯(cuò)誤,請(qǐng)以原文為準(zhǔn)。原文作者:水墨寒湘原文鏈接:https://juejin.im/post/582dfc... 正則表達(dá)式對(duì)于我來(lái)說(shuō)一直像黑暗魔法一樣的存...
摘要:今天來(lái)和大家分享下,我這段時(shí)間做接口測(cè)試的一些心得。接口測(cè)試就我目前的理解,大部分情況下,接口測(cè)試,就是按照接口測(cè)試文檔,輸入相應(yīng)的請(qǐng)求,看能否得到文檔上所寫的接口返回消息。這一過(guò)程,稱之為接口測(cè)試,如果沒(méi)有返回相應(yīng)的信息,說(shuō)明有了。 大家好,我是好學(xué)的小師弟。今天來(lái)和大家分享下,我這段時(shí)間...
摘要:周末是時(shí)隔兩月的家人團(tuán)聚,而每次內(nèi)容的準(zhǔn)備平均需要我集中精力工作小時(shí),所以第期的內(nèi)容今早才準(zhǔn)備好,對(duì)不住大家了。下面是本周精選內(nèi)容,請(qǐng)享用。本文作者王仕軍,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 showImg(https://segmentfault.com/img/remote/1460000009742537?w=1240&h=509); 周末是時(shí)隔兩月的家人團(tuán)聚,而...
摘要:最全的配置大全,我已經(jīng)加了詳細(xì)中文注釋,只需要找到自己想要的配置就可以了,強(qiáng)烈建議收藏用法非常簡(jiǎn)單,找到下的添加對(duì)象即可比如我要把規(guī)則原本單引號(hào)要變?yōu)殡p引號(hào),那加上注意這個(gè)規(guī)則如果違反了規(guī)則情況下,這里的數(shù)字表示不不處理,表示警告,表示錯(cuò)誤 最全的eslint配置大全,我已經(jīng)加了詳細(xì)中文注釋,只需要找到自己想要的配置就可以了,強(qiáng)烈建議收藏! 用法非常簡(jiǎn)單,找到.eslintrc.js下...
閱讀 2323·2023-04-26 00:28
閱讀 3067·2019-08-30 15:55
閱讀 2742·2019-08-30 12:47
閱讀 1550·2019-08-29 11:04
閱讀 3150·2019-08-28 18:14
閱讀 945·2019-08-28 18:11
閱讀 1671·2019-08-26 18:36
閱讀 3383·2019-08-23 18:21