js 正則學習小記之匹配字串

來源:互聯網
上載者:User

標籤:style   blog   class   code   ext   c   

原文:js 正則學習小記之匹配字串

今天看了第5章幾個例子,有點收穫,記錄下來當作回顧也當作分享。

關於匹配字串問題,有很多種類型,今天討論 js 代碼裡的字串匹配。(因為我想學完之後寫個文法高亮練手,所以用js代碼當作例子)
 var str1 = "我是字串1哦,快把我取走", str2 = "我是字串2哦,快把我取走"; 
比如這樣一個字串,匹配起來很簡單 /"[^"]*"/g 即可。

PS: 白色是 chrome 34 控制台中啟動並執行結果,深灰色是 sublime text 結果。

很容易就取到內容了,可是親,你有沒有想過,js字串裡允許轉義。
 var str1 = "我是字串1哦,\"快把我取走\"", str2 = "我是字串2哦,\"快把我取走\""; 

這不是我們想要的結果,所以我們要處理下轉義問題。
轉義的規則是 \ 後面跟著一個字元,所以我們用 \\. 去匹配它,就有了這樣的正則 /"(?:\\.|[^"])*"/g

可能對於正則不熟悉的朋友,一下子從 /"[^"]*"/g 變到 /"(?:\\.|[^"])*"/g 後理解不了,我簡單說明下。
(?:) 是非擷取的群組,就是不會把內容抓取儲存到記憶體裡的。
\\. 用於匹配 \" \‘ \a 之類的逸出字元,匹配成功的話消耗2個字元。
[^"] 匹配除了 " 以外的所有字元,匹配成功的話消耗1個字元。
所以這個運算式的意思是,先匹配 \. 這樣轉義,如果成功會消耗掉正確的轉義,如果不成功就用 [^"] 匹配。

消耗掉正確的轉義的意思是,比如 "aa\\aa\"aa\ufffaa" 都會被正常匹配,因為這些都在正常的轉義。
形如 "aa\\aa\"aa\ufff\\"aa" 這裡的 \\" 其中 \\ 會被匹配,而 " 既不滿足 \\. 也不滿足 [^"]
所以這個匹配結果會是 "aa\\aa\"aa\ufff\\" 後面的 aa" 無法匹配到。

所以現在我們得到了比較強力的正則,可以有效匹配 js 代碼中的字串了。

騷等,好像還有哪裡不對。
js 字串允許折行,形如這樣:

var str = "大家好我是js";

但是這樣的字串用剛才的正則能匹配嗎?答案是能。
因為 \ 不能被 \\. 匹配,但是可以被 [^"] 匹配到,\ 後面一個字元是 \r, \n 或 \r\n (具體是什麼分行符號要看系統了) 都能被 [^"] 匹配到,所以我們無意間寫了個強力的運算式。

現在剩下最後一個問題了,就是 ‘ 的匹配。
我們修改下運算式 /"(?:\\.|[^"])*"|‘(?:\\.|[^‘])*‘/g 就好了。

來測試一下:

var str1 = "我是字串1哦,\"快把我取走\"", str2 = ‘我是字串2哦,\‘快把我取走\‘‘;

匹配成功。


好了,這些就是今天的分享了,明天見。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.