正則表達式 - RegExp - 年度匯總

題記:“離婁之明,公輸子之巧,不以規矩,不能成方圓!”初聞正則表達式,以為一系列之規則,實則還為定義種種規矩!(∩_∩)~正則表達式言之“世間萬物皆有我來審判!!!吾乃王道!吾乃標準!”

“鈴鈴鈴”!下面進入正題。

1.圖形化工具

首先,我們來聊聊正則表達式的工具吧!此工具非彼工具,那就是將書寫的正則表達式文字利用圖形化給展示出來!就是一款圖形化工具。


圖形化工具.PNG

接下來就聊聊怎么把它安裝到本地吧!(在安裝完nodejs環境后)
1 首先下載壓縮包。地址: https://github.com/javallone/regexper-static

2345截圖20161226003212.png

2 然后將壓縮包給解壓后打開文件夾,按住shift點擊鼠標右鍵,打開終端,輸入“npm install”,裝下環境依賴;等其安裝完之后進行第三步。

3 在終端內輸入“npm start”,等待其啟動完畢。

成功界面.PNG

這樣做得好處就是只要在瀏覽器中輸入"127.0.0.1:8080"就可以打開圖形化工具了,不會受到網絡的影響,速度也很快。

圖形化界面.PNG

要想結束這個服務,就在剛才的終端按下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 '。

GIF.gif

在這里可以看出僅僅是將單詞 is 替換成 IS,而不會將this中的is也給替換了。

來來來 , 客官看這里

去掉首尾有特征字符串

去掉http協議的jpg文件的協議頭

http://defdsf/df.jpg

https://dsfasdf.jpg

http://dsfdsf.jpg

https://dsfadsfsaddsf/dsfdsf.jpg

我們可以通過正則表達式 ^http(://.+).jpg$ 來實現!這段正則表達式表示的是什么意思呢?可以通過圖形化工具來看看!

圖形化.PNG

表示是以 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 修飾符
  1. g: global全文搜索,不添加,搜索到第一個匹配停止
  2. i: ignore case 忽略大小寫,默認大小寫敏感
  3. 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
彈出框2

發現彈出框1中第一個haha被替換了,彈出框2中第一行和第二行中的haha都被替換了,這個也就是m 多行文本替換的功能啦!

No.3 元字符
正則表達式由兩種基本字符類型組成
  1. 原義文本字符:例如字符 a 到 z
  2. 元字符:在正則表達式中含有特殊含義的非字母字符,如下:

** . * + ? $ ^ | \ () {} [] **

\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 貪婪模式 與 非貪婪模式
  1. 貪婪模式:盡可能多的匹配次數

  2. 非貪婪模式:讓正則表達式盡可能少的匹配,也就是說一旦成功匹配不在繼續嘗試就是非貪婪模式。
    做法很簡單,就是在量詞后加 ? 即可。
    例如:'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);
打印.png

這里就體現出貪婪模式與非貪婪模式的區別了。第一個就是貪婪模式,盡可能的匹配;第二個就是非貪婪模式了,只匹配到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,但是在寫表單驗證的時候,一臉懵逼。。。不知所措!于是打算好好整理一下學過的正則表達式的內容,通過查看上課的筆記和網上的視頻學習后,感覺任督二脈瞬間被打通,神清氣爽,自信的感覺又回來了!

  1. 鞏固之前學習的內容
  2. 盡綿薄之力,請多指教!

“我一定會回來的,,,啊啊啊啊” ?? ??????? —— ?摘自灰太狼經典語錄

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容