正則表達式入門

什麼是正則?

正則是用於匹配字符串的字符組合的模式。正則不是一門編程語言,而是編程語言中會用到的一個工具,無論什麼編程語言,都會用到正則表達式。
舉個栗子:
想在如下文字中匹配以keai結尾的文字正則表達式

clipboard.png

".+"表示"某" ".+keai" 成功匹配編程

clipboard.png

再舉個栗子:
想在如下文字中匹配以chi開頭的文字緩存

"chi.+" 成功匹配編程語言

clipboard.png

爲何用正則?

除了正則,能夠在程序中寫一個解析器代替正則的工做。可是有了正則,一行代碼就能夠搞定~工具

正則核心語法

一個很好用的在線解析正則的網站
https://regexr.com/網站

最簡單的狀況:直接用文字匹配spa

clipboard.png

如下狀況沒法匹配 由於圓蔥aa是一個總體 在下面的字符串找不到匹配字符.net

clipboard.png

當想要匹配圓某時 可使用"圓."來匹配3d

clipboard.png

不難判斷出
1. "."的含義:匹配除斷行外任意一個字符
如圖 匹配了全部字符code

栗子1:
clipboard.png

栗子2:

clipboard.png

注意:斷行不可匹配!!!!以下圖

clipboard.png

一個特殊狀況 當咱們想要匹配3.14時 圖中匹配的結果倒是3.14和3-14

clipboard.png

這是由於"."表明任意字符
那麼如何才能明確匹配到3.14呢?這就須要轉義符"\"
"\."表明"." 如圖 便可明確匹配到3.14

clipboard.png

2."w" 匹配阿拉伯數字,英文大小寫字母和下劃線(相似於用戶名的格式)

clipboard.png

3."W" 匹配被"w"排除在外的字符("w"的補集)

clipboard.png

4."d" 匹配阿拉伯數字

clipboard.png

注意:"\d\.\d"匹配小數

clipboard.png

5."\D" 匹配非阿拉伯數字 包括空格("\d"的補集)

clipboard.png

6."\s" 匹配空白字符:空格 製表符 斷行等

clipboard.png

7."\S" 匹配被"\s"排除在外的字符("\s"的補集)

clipboard.png

8."[]"字符集合方括號中填寫出現的可能性(範圍) 整個括號算一個字符

舉個栗子:

clipboard.png

"-"在"[ ]"表示表示從一個字符到另外一個字符
舉個栗子就懂~

匹配a到z

clipboard.png

匹配0到9

clipboard.png

9.當須要匹配中文時 使用Unicode
Unicode是萬國碼,是用數字表明文字的一項標準。世界上全部能夠書寫,發音的語言都被Unicode所吸納。
中文字符從0x4e00(19968)開始 0x9fa5(40869)結束
也就是說 記錄在Unicode中的中文字符有20901個字~

能夠查詢Unicode的網站
http://graphemica.com/

clipboard.png

10."[範圍]+"重複一次或屢次

clipboard.png

注意特殊狀況 (應用到前面所說 方括號表明範圍)

clipboard.png

11."[範圍]*"重複零次或屢次

clipboard.png

12."[範圍]?"重複零次或一次

clipboard.png

13."{a,b}"指定重複範圍(a到b次)

clipboard.png

clipboard.png

"b" word boundary 單詞邊界

clipboard.png

想精確匹配一段字符 必須重複幾回 也可在花括號中指定

clipboard.png

clipboard.png

想指定某字符至少重複幾回 也可在花括號中指定

至少重複兩次

clipboard.png

{0,}至關於"+" {0,1}至關於"?" {1,}至關於"*"

14.分組匹配
直接舉個栗子來講
咱們但願 替換句子中兩個姓名的位置。如何實現? 這就要用到分組匹配。

clipboard.png

首先 使用圓括號將兩我的名摘出來(也就是分組)

clipboard.png

使用https://regexr.com/網站中的替...

clipboard.png

"$1"表明第一組(李栓蛋) "$2"表明第二組(王花花)

clipboard.png

這樣看來 想替換兩名字的位置就簡單極了

clipboard.png

so easy

一次性將兩個句子都替換了

clipboard.png

這就是分組的強大之處:能夠將咱們指定的組暫時緩存,用序號表示,也能夠命名(JS暫時不支持命名)

15.分組匹配但不捕獲
首先看幾組電話號碼

clipboard.png

前4個爲移動號碼 第5個爲聯通號碼 最後一個爲電信號碼
首先咱們想要選中全部的移動號碼 而後拿到它們的後四位

首先咱們在意的是前三位(一個號段) 而後是中間四位(咱們並不在意它們是什麼) 最後是咱們想要獲取的四位(因爲是咱們最後想要獲取的 因此咱們用括號括起來 說明它是一個組)

clipboard.png

而後經過看號段 將其它號碼排除在外 也就是說 咱們只匹配137138182183這四種號段的電話號碼 可使用如下寫法

clipboard.png

如今咱們既匹配了全部移動號碼 又獲取到了他們的後四位

clipboard.png

此時咱們只用到了第2組,也就是說咱們的第一組是浪費的。咱們只是想用這種方式匹配它而並不想要獲取。有沒有這種操做呢?固然有。
(?:模式)匹配分組但不捕獲

clipboard.png

這樣一來就不浪費了~

16.正向預查
首先看這坨字符

clipboard.png

前面是貨幣值,後面是貨幣單位。
如今咱們的任務是,選中全部以元結尾的數字(不包括單位)

當咱們須要匹配單位時

clipboard.png

但咱們如今的任務是 只獲取數字 不包括單位 此時就須要用到正向預查
(?=模式) 正向確定預查

clipboard.png

它的含義就是 前面是咱們要匹配的東西 後面必定是等號後面的東西 可是不匹配它

(?!模式) 正向否認預查
這句的意思是 匹配全部的數字 後面不是元的

clipboard.png

咱們但願匹配100刀和100磅 可是匹配結果和咱們預想不一樣

這就須要咱們注意 當使用反向預查時 咱們後面要將前面匹配的類型排除在外。

clipboard.png

這就成功匹配了。

17.反向預查
上面咱們提到正向預查 正向預查是 咱們要匹配的東西的右邊必定是什麼
而反向預查是 咱們要匹配的東西的左邊必定是什麼

咱們的任務是 匹配全部人民幣的數額

clipboard.png

(?<=模式) 反向確定預查

clipboard.png

注意:JS引擎不支持反向預查 右上角切換一個更加完善的引擎便可~

與之相反的是反向否認預查

(?<!模式) 反向否認預查

clipboard.png

咱們發現 跟以前出現了一樣的問題

同理前面所說 應用反向預查時要將後面匹配的類型排除在外

clipboard.png

這樣就能夠匹配到非人民幣的貨幣數額~很是強大!

相關文章
相關標籤/搜索