題記:“離婁之明,公輸子之巧,不以規矩,不能成方圓!”初聞正則表達式,以為一系列之規則,實則還為定義種種規矩!(∩_∩)~正則表達式言之“世間萬物皆有我來審判!!!吾乃王道!吾乃標準!”
“鈴鈴鈴”!下面進入正題。
1.圖形化工具
首先,我們來聊聊正則表達式的工具吧!此工具非彼工具,那就是將書寫的正則表達式文字利用圖形化給展示出來!就是一款圖形化工具。
接下來就聊聊怎么把它安裝到本地吧!(在安裝完nodejs環境后)
1 首先下載壓縮包。地址: https://github.com/javallone/regexper-static
2 然后將壓縮包給解壓后打開文件夾,按住shift點擊鼠標右鍵,打開終端,輸入“npm install”,裝下環境依賴;等其安裝完之后進行第三步。
3 在終端內輸入“npm start”,等待其啟動完畢。
這樣做得好處就是只要在瀏覽器中輸入"127.0.0.1:8080"就可以打開圖形化工具了,不會受到網絡的影響,速度也很快。
要想結束這個服務,就在剛才的終端按下ctrl+c。
到底正則表達式是何方神圣呢?用它能做到什么樣的功能呢?
例如,我們在sublime中按Ctrl + h 調出替換框。 最讓小白驚奇的是:竟然在sublime中也可以使用正則表達式來完成替換工作!!!sublime插件真是相當強大的啊!瞧!下面例子:
將單詞is替換成IS
He is a good man.
This is a text.
Where are you?
Display is also a noun.
isn't it ?
What is your name?
通過正則表達式很容易的將 ' is ' 替換成 ' IS '。
在這里可以看出僅僅是將單詞 is 替換成 IS,而不會將this中的is也給替換了。
來來來 , 客官看這里
去掉首尾有特征字符串
去掉http協議的jpg文件的協議頭
http://defdsf/df.jpg
https://dsfasdf.jpg
http://dsfdsf.jpg
https://dsfadsfsaddsf/dsfdsf.jpg
我們可以通過正則表達式 ^http(://.+).jpg$ 來實現!這段正則表達式表示的是什么意思呢?可以通過圖形化工具來看看!
表示是以 http 開頭,然后分成一個組,組內是 :// 加上任意字符,最后是以 .jpg 結尾的規則。我們就開始替換了!
正式學習正則表達式
No.1 兩種方法實例化正則表達式的方式
- 字面量
var reg = /\bis\b/g; var reg = /\bis\b/gim;
- 構造函數法
var reg = new RegExp("\bis\b","g")
tip:推薦使用字面量方法,因為看起來簡單(easy)
No.2 修飾符
- g: global全文搜索,不添加,搜索到第一個匹配停止
- i: ignore case 忽略大小寫,默認大小寫敏感
- m: multiple lines 多行搜索
重點來說說這個m多行匹配吧:
如果 multiline 為 false,那么 "^" 匹配字符串的開始位置,而 "$" 匹配字符串的結束位置。
同樣如果 multline 為 true,那么 "^" 匹配字符串開始位置以及 "\n" 或 "\r" 之后的位置,而 "$" 匹配字符串結束位置以及 "\n" 或 "\r" 之前的位置。
其實很簡單,多行模式就是根據 \r 或 \n 把字符串分隔為多個單行模式去分別匹配,關鍵是要與 ^ 或 $ 配合使用!
var s = "haha, hello world!\nhaha, ni hao!";
alert(s.replace(/^haha/g, "heihei"));
alert(s.replace(/^haha/gm, "heihei"));
結果:
發現彈出框1中第一個haha被替換了,彈出框2中第一行和第二行中的haha都被替換了,這個也就是m 多行文本替換的功能啦!
No.3 元字符
正則表達式由兩種基本字符類型組成
- 原義文本字符:例如字符 a 到 z
- 元字符:在正則表達式中含有特殊含義的非字母字符,如下:
** . * + ? $ ^ | \ () {} [] **
\t 水平制表符
\v 垂直制表符
\n 換行符
\r 回車符
\0 空字符
\f 換頁符
\cX 與X對應的控制字符(Ctrl + X)
如果想要把元義字符轉換為普通字符,只需在其前面加 ** 即可
No.4 字符類
一般情況下正則表達式中一個字符對應字符串一個字符
這里的 ab\t 對應的就是* "ab"+tab*
我們可以通過使用元字符[]來構建一個簡單的類
所謂的類是指符合某些特性的對象,一個泛指,而不是特指某個字符
表達式[abc]把字符a或b或c歸為一類,表達式可以匹配這類的字符
No.5 字符類取反
使用元字符^創建 反向類/負向類
反向類的意思是不屬于某類的內容
表達式[^abc]表示不是字符a或b或c 的內容
No.6范圍類
使用字符類匹配數字
我們可以使用[a-z]來連接兩個字符表示從a到z的任意字符
這是個閉區間 包含a和z本身
在[ ]組成的類的內部是可以連寫的 [a-zA-Z]
No.7 預定義類
正則表達式提供預定義類來匹配常見的字符類
字符 | 等價類 | 含義 |
---|---|---|
. | [^\r\n] | 除了回車符和換行符以外的所有字符 |
\d | [0-9] | 數字字符 |
\D | [^0-9] | 非數字字符 |
\w | [a-zA-Z_0-9] | 單詞字符(字母、數字、下劃線) |
\W | [^a-zA-Z_0-9] | 非單詞字符 |
\s | [\t\n\x0B\f\r] | 空白符 |
\S | [^\t\n\x0B\f\r] | 非空白符 |
No.8 邊界
字符 | 含義 |
---|---|
^ | 以XXX開始 |
$ | 以XXX結束 |
\b | 單詞邊界 |
\B | 非單詞邊界 |
No.9 量詞
字符 | 含義 |
---|---|
? | 出現0次或1次 (最多一次) |
+ | 出現一次或多次 (最少一次) |
* | 出現零次或多次 (任意次) |
{n} | 出現n次 |
{n,m} | 出現n到m次 |
{n,} | 至少出現n次 |
No.10 貪婪模式 與 非貪婪模式
貪婪模式:盡可能多的匹配次數
非貪婪模式:讓正則表達式盡可能少的匹配,也就是說一旦成功匹配不在繼續嘗試就是非貪婪模式。
做法很簡單,就是在量詞后加 ? 即可。
例如:'123465789'.match(/\d{3,5}?/g)
var s = "d123456ddd321236";
var r = s.match(/\d{3,6}/g);
var w = s.match(/\d{3,6}?/g);
console.log(r);
console.log(w);
這里就體現出貪婪模式與非貪婪模式的區別了。第一個就是貪婪模式,盡可能的匹配;第二個就是非貪婪模式了,只匹配到3個數字就OK了。(這名字取得也是非常符合其原意啊!)
No.11 分組
使用( )可以達到分組的功能,使量詞作用于分組。
如果我們想連續替換某段字符串3次的話,例如替換ABoyonBoyonBoyonA中的Boyon的話,我們是否可以這樣做呢?
var s = "ABoyonBoyonBoyonA";
var r = s.match(/Boyon{3}/g);
console.log(r);
結果是不行的!!!
因為這段正則表達式的含義是匹配 Boyonnn 這個字符串,結果在s中未找到,所以打印的結果為 null;
要想達到效果的話,我們應該這么寫:
var s = "ABoyonBoyonBoyonA";
var r = s.match(/(Boyon){3}/g);
console.log(r);
這里將 Boyon 當作一個整體來替換了,所以就OK啦
No.12
使用 | 可以達到 或 的效果
Byron | Casper反向引用
'2016-12-12'.replace(/(\d{4})-(\d{2})-(\d{2})/g,"$2-$3-$1")忽略分組
不希望捕獲某些分組,只需要在分組內加上 ?: 就可以了
(?:Byron)
</br>
No.13 敬請期待!!!
</br>
關于正則總結
由于本人小白一枚,在剛開始學完正則后感覺還是every good,但是在寫表單驗證的時候,一臉懵逼。。。不知所措!于是打算好好整理一下學過的正則表達式的內容,通過查看上課的筆記和網上的視頻學習后,感覺任督二脈瞬間被打通,神清氣爽,自信的感覺又回來了!
- 鞏固之前學習的內容
- 盡綿薄之力,請多指教!
“我一定會回來的,,,啊啊啊啊” ?? ??????? —— ?摘自灰太狼經典語錄