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