壹 ❀ 引
對於初學正則的同學來說,^$這兩個看似簡單的字符卻在使用中總讓匹配結果超出我們的預期,^什么時候表示行首什么時候表示反義?^ $兩個一起寫表示什么含義?今天我們就來詳細聊聊這兩個字符。
貳 ❀ 關於^與$
先解釋^與$概念,很簡單的兩句話,先留個印象。
^ 脫字符:匹配開頭,若存在多行匹配多行的行頭。
$ 美元符:匹配尾部,若存在多行匹配多行的尾部。
我們知道正則是一種匹配模式,要么匹配字符,要么匹配位置。這里我們得從這兩種匹配情況分別解釋這兩個字符。
1.從匹配字符角度
當用於匹配字符時,^與$更多是作為匹配出精准結果的輔助條件,我們先看個簡單的例子:
'123'.match(/\d/g);//[1,2,3]
很好理解,全局(注意結尾有個g)匹配單個任意數字,很明顯1,2,3都符合條件,所以這里找到了三個匹配結果;我們分別添加 ^ 與 $ 再看:
'123'.match(/^\d/g);//[1] '123'.match(/\d$/g);//[3]
此時 ^\d 只能匹配到1,而 \d$ 只能匹配到3,你肯定就納悶了,不對啊,我正則后面不是有個g表示全局匹配嗎,怎么只匹配一個了呢?以 ^\d為例,此時的匹配條件其實是找開頭位置后的一個任意數字,\d$ 表示匹配結尾前的一個任意數字。開頭和結果對於一個不換行的字符串都只有一個,所以自然只能找到一個數字了,現在能理解前面所說的^$作為輔助條件的意思了嗎。
那么我們現在將數字換行,再看:
'12\n34'.match(/^\d/mg);//[1,3] '12\n34'.match(/\d$/mg);//[2,4]
由於存在換行,導致現在有兩個開頭位置和兩個結尾位置(注意匹配中使用了m,表示換行匹配),所以匹配結果也變成了兩個,不難理解吧。
正則除了根據規則匹配對應的字符,還有一個強大的功能就是匹配位置。什么是位置呢?以字符 1234 為例,每個箭頭都代表一個位置,其中第一個箭頭的位置就是 脫字符 ^,結果位置就是美元符$, 如下圖:
所以當我們在匹配位置時,^$也成為了我們需要匹配的結果,例如,我需要將 1234 首尾位置加上花朵:
'1234'.replace(/^|$/g, '❀');// "❀1234❀"
當然,在匹配位置時^與$也是幫助我們精確位置的輔助條件,比如常用的千位分隔符正則:
'12345678'.replace(/(?!^)(?=(\d{3})+$)/g, ',');// "12,345,678"
這段正則的意思,就是從右往左找,每隔三位數字前面的位置替換成逗號,同時排除字段頭部位置,因為當不排位開頭位置,只要字符長度是三的倍數,就會導致頭部也會出現逗號的尷尬局面,例如:
'123456789'.replace(/(?=(\d{3})+$)/g, ',');// ",123,456,789"
所以針對千位分隔符正則中的 ^ 與 $ 而言,^起到了排除開頭位置的作用,而$起到了改變正則匹配的方向,由默認的從左到右變成了從右到左每隔三位的查找。
3.反義字符組
^除了作為脫字符表示從頭匹配,開頭位置兩個含義外,還能作為反義字符使用,例如,我想匹配除了123之外的任意字符:
/[^123]/.test(1); //false /[^123]/.test(2); //false /[^123]/.test(3); //false /[^123]/.test(4); //true
這里[^123]就表示除了123之外的意思,那么我們怎么知道^什么時候表示反義,什么時候表示開頭位置呢?很簡單,因為當它只有放在字符組中時才叫反義字符組,所以當然是只有出現在[]中時才是反義的意思。
4.^與$同時出現在正則前后表示什么?
對於新手而言,^$同時出現確實有點誤解人,畢竟我們前面說^表示從左到右,$能起到從右到左的作用,同時出現難道匹配左右夾擊?其實同時寫時只是限制字符的起點與終點,我們來看個例子:
/123/.test(' 123 '); //true /^123$/.test(' 123 '); //false
第一個輸出true,這是因為被檢測的字段只要有123這三個字段就行了,不關心你123前后還有什么。而第二個我們利用^$限時了字符的兩端,也就是說如果你test想為真,那么你的字符開頭后面必須是1,結尾前面必須是3,字符的開頭結尾被固定死了。一般在驗證表單輸入是否正則,我們都會加上^$。
那么關於^與$的解析就說到這了,太晚了,本文結束。