摘要:正則表達式一直是困擾很多程序員的一門技術,當然也包括曾經的我。正則表達式的基本組成元素可以分為字符和元字符。字符很好理解,就是基礎的計算機字符編碼,通常正則表達式里面使用的就是數字英文字母。在正則表達式里,集合的定義方式是使用中括號和。
正則表達式一直是困擾很多程序員的一門技術,當然也包括曾經的我。大多數時候我們在開發過程中要用到某些正則表達式的時候,都會打開谷歌或百度直接搜索然后拷貝粘貼。當下一次再遇到相同問題的時候,同樣的場景又再來一遍。作為一門用途很廣的技術,我相信深入理解正則表達式并能融會貫通是值得的。所以,希望這篇文章能幫助大家理清思路,搞懂正則表達式各種符號之間的內在聯系,形成知識體系,當下次再遇到正則表達式的時候可以不借助搜索引擎,自己解決。
正則表達式到底是什么
正則表達式(Regular Expression)其實就是一門工具,目的是為了字符串模式匹配,從而實現搜索和替換功能。它起源于上個20世紀50年代科學家在數學領域做的一些研究工作,后來才被引入到計算機領域中。從它的命名我們可以知道,它是一種用來描述規則的表達式。而它的底層原理也十分簡單,就是使用狀態機的思想進行模式匹配。大家可以利用regexper.com這個工具很好地可視化自己寫的正則表達式:
如/dw+/這個正則生成的狀態機圖:
對于具體的算法實現,大家如果感興趣可以閱讀《算法導論》。
從字符出發
我們學習一個系統化的知識,一定要從其基礎構成來了解。正則表達式的基本組成元素可以分為:字符和元字符。字符很好理解,就是基礎的計算機字符編碼,通常正則表達式里面使用的就是數字、英文字母。而元字符,也被稱為特殊字符,是一些用來表示特殊語義的字符。如^表示非,|表示或等。利用這些元字符,才能構造出強大的表達式模式(pattern)。接下來,我們就來從這些基本單位出發,來學習一下如何構建正則表達式。
單個字符
最簡單的正則表達式可以由簡單的數字和字母組成,沒有特殊的語義,純粹就是一一對應的關系。如想在"apple"這個單詞里找到‘a"這個字符,就直接用/a/這個正則就可以了。
但是如果想要匹配特殊字符的話,就得請出我們第一個元字符****, 它是轉義字符字符,顧名思義,就是讓其后續的字符失去其本來的含義。舉個例子:
我想匹配*這個符號,由于*這個符號本身是個特殊字符,所以我要利用轉義元字符來讓它失去其本來的含義:
/*/
如果本來這個字符不是特殊字符,使用轉義符號就會讓它擁有特殊的含義。我們常常需要匹配一些特殊字符,比如空格,制表符,回車,換行等, 而這些就需要我們使用轉義字符來匹配。為了便于記憶,我整理了下面這個表格,并附上記憶方式:
特殊字符 | 正則表達式 | 記憶方式 |
---|---|---|
換行符 | new line | |
換頁符 | f | form feed |
回車符 | return | |
空白符 | s | space |
制表符 | tab | |
垂直制表符 | v | vertical tab |
回退符 | [] | backspace,之所以使用[]符號是避免和重復 |
多個字符
單個字符的映射關系是一對一的,即正則表達式的被用來篩選匹配的字符只有一個。而這顯然是不夠的,只要引入集合區間和通配符的方式就可以實現一對多的匹配了。
在正則表達式里,集合的定義方式是使用中括號[和]。如/[123]/這個正則就能同時匹配1,2,3三個字符。那如果我想匹配所有的數字怎么辦呢?從0寫到9顯然太過低效,所以元字符-就可以用來表示區間范圍,利用/[0-9]/就能匹配所有的數字, /[a-z]/則可以匹配所有的英文小寫字母。
即便有了集合和區間的定義方式,如果要同時匹配多個字符也還是要一一列舉,這是低效的。所以在正則表達式里衍生了一批用來同時匹配多個字符的簡便正則表達式:
匹配區間 | 正則表達式 | 記憶方式 |
---|---|---|
除了換行符之外的任何字符 | . | 句號,除了句子結束符 |
單個數字, [0-9] | d | digit |
除了[0-9] | D | not digit |
包括下劃線在內的單個字符,[A-Za-z0-9_] | w | word |
非單字字符 | W | not word |
匹配空白字符,包括空格、制表符、換頁符和換行符 | s | space |
匹配非空白字符 | S | not space |
循環與重復
一對一和一對多的字符匹配都講完了。接下來,就該介紹如何同時匹配多個字符。要實現多個字符的匹配我們只要多次循環,重復使用我們的之前的正則規則就可以了。那么根據循環次數的多與少,我們可以分為0次,1次,多次,特定次。
0 | 1
元字符"); 最后,歡迎大家關注我的公眾號,一起學習交流。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/6649.html
摘要:對前端來說,使用的場景不多,但是像微信端的對話系統的表情包,就使用到了一個特定的規則。我是一個前端,工作年了,現在失業,想進入騰訊工作,這是我的聯系方式這個正則雖 我發現有個別字符被這個編輯器給刷掉了,但是灰色區域顯示正常,以灰色區域代碼為準 什么玩意? 在我剛開始學習編程的時候,就聽過正則了,也聽說正則很牛逼,懂正則的更牛逼。但是苦于沒有人指點,也沒有使用正則的場景,自己看教程又懵逼...
本文收集學習過程中使用到的資源。 持續更新中…… 項目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫 css js es6 移動端 微信公眾號 小程序 webpack GraphQL 性能與監控 高質文章 趨勢 動效 數據結構與算法 js core 代碼規范...
摘要:可以在該鉤子中進一步地更改狀態,不會觸發附加的重渲染過程。我工作中只用到,對和不怎么熟與的區別相同點都支持指令內置指令和自定義指令都支持過濾器內置過濾器和自定義過濾器都支持雙向數據綁定都不支持低端瀏覽器。 看看面試題,只是為了查漏補缺,看看自己那些方面還不懂。切記不要以為背了面試題,就萬事大吉了,最好是理解背后的原理,這樣面試的時候才能侃侃而談。不然,稍微有水平的面試官一看就能看出,是...
摘要:常見的關鍵字有等等常見的保留字有等等本文可能會直接用到的有定義一個變量在瀏覽器控制臺或后臺終端輸出一個值在瀏覽器彈窗輸出一個值基本數據類型基本類型包括數值,字符串,,和布爾型。 標識符命名規則 對于變量名,鍵值對中的鍵名應滿足如下要求: 開頭必須是字母、下劃線(_)或美元符號($) 除了開頭以外的字符也可以是數字 不可以是關鍵字和保留字 最好不要和全局變量/函數同名,會把原有變量/函...
閱讀 2830·2021-11-24 09:39
閱讀 4082·2021-10-27 14:19
閱讀 2043·2021-08-12 13:25
閱讀 2334·2019-08-29 17:07
閱讀 1112·2019-08-29 13:44
閱讀 1066·2019-08-26 12:17
閱讀 462·2019-08-23 17:16
閱讀 2048·2019-08-23 16:46