【怕啥弄啥系列】總要愛上它《正則》 - 基礎

正則很煩,但有了正則,有時能把複雜的東西變得簡單。因爲正則本身就很複雜,負負得正。

有的正則雖然功能強大,但是非常長,摻雜着很多規則,讓人一看就噁心。反正我也是非常怕正則的。

正則需要花費大量的時間去學習規則,研究規則,所以有時很怕去接觸它,但是總要學會勇敢面對。

這東西又不是一天學完,就永生記得的,就算忘了然後看我做的筆記,也讓人很煩。

所以,我今天必須寫得簡單明白,也好讓自己以後容易撿起來。

鑑於內容真的實在太多,所以第一部寫些基礎用法,第二部寫些高級用法

TIP

Vue 在處理組件模板上,就使用了非常多而且複雜的正則,匹配指令,匹配子組件 等等,簡直無往不利,正則重要性可見一斑。



1
    正則
    

正則 是 對字符串的一種過濾邏輯,主要作用對象是字符串


正則的作用

1、匹配字符串位置

2、獲取特定的字符串


我打算從下面幾部分去總結正則

1、正則的基本語法

2、正則的 flags,也就是標誌位

3、正則涉及的方法和屬性

4、重複量詞

5、分組,捕獲

6、引用、反向引用

7、正向前瞻、反向前瞻

8、貪婪匹配、惰性匹配


內容很多,也很不容易理解,需要親身實踐,體會其中規則的用處。

分組捕獲、引用反向引用,正向反向前瞻,貪婪惰性匹配 會放到 下篇文章說明,這幾塊內容 比較重要 和 複雜,是使用正則必須掌握的高級內容



2
    正則基本語法
    

基本語法,就是我們經常會在正則中使用到的規則,說明的列表如下

[xyz] 匹配 括號內的 任意一個字符,
[^xyz] 相反,不要其中的字符
\s 匹配任意空白字符
\S 不要空白字符
\d 匹配數字    
\D 不要數字    
\w 匹配 字母,數字,下劃線    
\W 不要 字母,數字,下劃線
\b 匹配單詞邊界    
\B  不要單詞邊界,匹配其他邊界    
^ 匹配起始位置    
$ 匹配結束位置    
. 匹配任意字符

根據解釋來看,是挺好理解的,直到我在項目中使用了,現在特別講一下疑惑過我的地方


1

\b 匹配單詞邊界

單詞邊界到底是什麼東西?

舉栗子

既然說匹配邊界,使用 \b 匹配 " 222 name" 得到的邊界是什麼東西?如圖

可以看到,圖中粉色的虛線,就是匹配的邊界。把111 和 word 當做一個單詞,那麼單詞的邊界,就是單詞的兩邊啦!默認是 連續數字連續字母 當做一個單詞

連續數字,連續字母,如果連續的詞中間加個標點符號呢?"

試試在 word 中間加一個 +

額,還是一樣,把 wo 和 rd 當成了一個單詞,所以匹配出 四條邊界

嘗試下把邊界 替換 成其他東西

2

\B 匹配非單詞邊界

這個說的是匹配非單詞邊界

同樣的例子測試

得到的邊界,是除了 單詞兩邊之外的所有的邊界。

按我的理解

每個字符都有兩邊,這兩邊就是字符的邊界

匹配結果 = 所有字符的邊界 - 所有單詞的邊界

嘗試下把邊界替換成其他東西


3

\s 匹配空白符

匹配任意空白字符,這個空白字符,可 不止是空格 而已,還包括下面這些

\r 回車符
\t 製表符
\n 換行符
\f 換頁符

這些 一開始我也不知道的,以爲只匹配 空格而已,真是無奈

來,我們使用 \s 嘗試匹配上面的的空白符,發現都可以被匹配到,好的,沒有被騙

4

.  不匹配 換行符

.  可以匹配任意字符,卻不包括 換行符,現場試驗

一個含有 換行符 的字符串打印如下

開始匹配,發現 \n 沒有被替換,坐實了坐實了


3
    正則標誌位
    

正則有三個標誌位

1、ignoreCase,簡寫爲 i

2、muitiline,簡寫爲 m

3、global,簡寫爲 g


1

ignoreCase


正則加上 i,那麼就 不區分大小寫 

對比 有 i 和 沒 i 的區別


2

global


正則加上 g,就會 全局匹配

對比 有 g 和 沒 g 的區別


3

multiline


正則加上 m,就會 多行匹配

而往往多行匹配也要加上 g 纔行

A:" 那我直接用 g 不就好了?還能 m 幹嘛?

B:恩,如果你想匹配多行的開頭時,就有用了 

對比 有 m 和 沒 m 的區別

哈哈  用 g 不用 m,你一樣匹配不到其他行的開頭, gm 缺一不可



4
    正則涉及的方法和屬性
    


正則可以調用哪些方法 和屬性?

1、方法:test 、exec

2、屬性:source、ignoreCase、multiline、global


1

方法 test

驗證字符串是否可以匹配正則

返回 布爾值,常用於表單驗證


2

方法 exec

找出字符串中的 匹配項

返回一個數組,數組 包含 第一個匹配項,index(匹配項在字符串中的位置),input(匹配的字符串)

exec 需要記住兩個點

1、常用於正則捕獲時

      捕獲就是把特定的字符串抓出來,在後面會詳細說

2、不管是否設置 全局搜索 g,都只會返回 一個匹配項

a. 沒有設置全局匹配 g

      不管你調用多少次,都只會返回 第一個 匹配項

var str="abc"
var reg1=/\w/reg1.exec(str) reg1.exec(str) reg1.exec(str)

b. 設置了全局匹配 g

var str="abc"
var reg1=/\w/greg1.exec(str) reg1.exec(str) reg1.exec(str)

看到了把,如果設置了 全局搜索 g,那麼  exec 會在字符串上 繼續 去匹配


到底是什麼魔力?歡迎來到本期探索未知的世界

答案是 對象的屬性 - lastIndex

如果我每次調用 exec 都重置一次 lastIndex 的話


var str="abc"
var reg1=/\w/g
reg1.exec(str) reg1.lastIndex = 0
reg1.exec(str) reg1.lastIndex = 0
reg1.exec(str)

結局和 沒有放 g 是一樣的結果,事實證明了是 lastIndex 在作祟,保存了上一次匹配的位置,然後下次匹配時,從上一次位置開始,而不是從頭開始了


所以說,哪有從頭開始的愛情,不過是 從上一個傷疤 繼續。



3

屬性 source

返回 正則 的 字符串形式


4

屬性 ignoreCase

返回 當前正則是否設置 忽略大小寫


5

屬性 multiline

返回 當前正則是否設置 多行匹配


6

屬性 global

返回 當前正則 是否設置 全局匹配



字符串在哪些方法中可以使用正則 ?

match,replace,split,search


1

match


這個方法很奇怪,返回的東西跟正則是否設置全局有關


a. 沒有設置了全局

var str="abc"
var reg1=/\w/
console.log(str.match(reg1))

返回的內容和 正則 的 exec 方法一毛一樣


b. 設置全局

返回一個數組,裏面存放所有匹配項

這樣是不是感覺挺爽的哦,把所有匹配項都放在一個數組,就像是....

把石榴全都剝出來放在一個碗裏的感覺一樣

但是這個方法,想使用分組,以爲可以把所有 括號匹配項 放進去的時候,哎,人算不如天算啊......


2

replace


正則替換,感覺沒什麼好說的....

說明一下,replace 不會改變原來字符串,而是返回替換後的字符串


3

split

把不是匹配項的放在一個數組裏面


有人說,那我這麼做效果是一樣的啊,爲毛還要用正則?


正則當然是爲了處理複雜的情況,比如你的字符串中有很多個 空格,你說要怎麼匹配


正則這時候不就起作用了嗎?現在就算你有幾百個 空格 ,都一樣正常匹配,這就是正則的作用場景。

感覺像是容錯匹配一樣


4

search

返回匹配項 在 字符串中的 起始位置,如果找不到就返回-1

恩 ,bc的起始位置 在 字符串中的 第一個位置(從 第0 個位置開始的)

上面這些方法,都可以使用 字符串 代替 正則 去 進行 replace,split,但是 使用字符串,匹配的情況太少,而使用正則,可以適用很多種情況,完成更加複雜的功能。



5
    重複量詞
    
0 次或更多次

1次 或者 沒有

+ 一次 或者更多
{n} 重複 n 次
{n,} 重複 n 次以上
{n,m}

重複 n次 到 m 次之間


量詞挺簡單的一個東西,理解起來好像沒什麼問題,無非就是匹配多少次的問題





(~ ̄▽ ̄)~ 
   最後
    

我現在學一樣東西,不求自己馬上掌握,也不要求自己總是複習,因爲沒有太多的時間和耐心。

所以我現在,必須把那些容易忘而且難的東西,給簡單化地寫成一篇文章,這樣,就算忘記了,瞅一眼就能撿回來

節省自己的時間的時候,也希望能夠幫助到需要的人,大家一起進步。


未完待續........


關注我可以說是相當優秀了


本文分享自微信公衆號 - 神仙朱(skying-zhu)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章