概述
正則作為一種元語言工具內建在各種程式語言中,特別適合文字處理、資料驗證等領域。
其優點是程式碼短小表現力巨大,缺點是難於閱讀難於理解幾乎無法除錯。
我作為一個小菜鳥,希望能夠摸清正則的門路,順利記住一些常見的正則需求而不必每次都上網求助。以下是在js實現的正則環境下。
認識字元
想要自己構造正則解決需求必先學會模仿,而模仿必先認識。
面對一串長長的正則符號,我們第一個目的是認識其中每個符號的表達意思,特別是有些符號不止一個字元要知道其是怎麼組合的。
很重要一點,正則是從左往右解讀的。
確定正則範圍
在 / / 之間的是正規表示式,第二個/之後的是模式,
你直接第一眼看上去就是 第一個/和最後一個/ 以確定正則的範圍
轉義
因此如果要用 / 你必須轉義,我相信你明白轉義的意思即 前面加形成表達 /,
當然其他你需要表達的元字元都可以用 來轉義,
so,what is 元字元?
簡單理解就是被用做正規表示式語法的字元,
好比html中你要 寫 < 就必須轉義,只不過html轉義方式是換成[實體字元](http://www.w3school.com.cn/tags/html_ref_symbols.html)罷了。
注意:不代表都是轉義字元,諸如
等都是元字元,想要匹配
則要\n
模式
模式只有3種,可多用
g 表示 global全域性
i 表示 ignore case 忽略大小寫
m 表示 multiline 多行
gi 表示 全域性忽略大小寫
依次類推
很多文字工具的正則不要求你寫後面的模式是因為他們一般直接預設gim
理解什麼是全域性g
不加g 匹配到一個就結束,加g則一直匹配到結尾
正則常用符號分類
符號的具體含義不太理解沒關係,畢竟我們第一次用,且不需要記住所有符號啊,我們的目標是拿下常用的,多見幾次就明白了
Anchor:匹配位置而非字元
^ 一行或一個串的起始位置
$ 一行或一個串的結束位置
匹配一個字邊界,即字與空格間的位置。
B 匹配與相反的位置
Character class:匹配特殊字符集,預定義了一些字符集給你用,你也可以自己構造
. 匹配除了換行符之外的所有字元
s 匹配空白符
S 匹配非空白符
w 相當於匹配[A-Za-z0-9_],即所有大小寫字母,數字,underscore(連字元_).//注意不是-
W 與w正好相反
d 數字
D 非數字
插一句,空白符包括換頁、換行、回車、製表(tab是其中一種)
範圍:這個應該隸屬匹配字符集的Character class,但感覺分開來講比較好
[A-Z] 表示A到Z範圍內都可以匹配,跟數學中的用法一致
[AZ] 表示A、Z都行
[^AZ] 表示既不是A也不是Z //這是^的第二種用法了,不過別擔心,表示反義它必須在[]裡
Escaped(轉義):
簡單理解就是被用做正規表示式語法的字元需要轉義,但個人感覺跟多靠積累
記得js中的uxxxx這種形式吧,這是轉義某種unicode字元,具體什麼字元要查表,
另外還有 00這種以八進位制開頭的與xFF這種16進位制的都可以表示同樣的東西,
這三者能夠表示所有實體符號,且能互換使用。
cx 匹配由x指明的控制字元,x必須[A-Za-z]
比如 cI 表示tab,等價
cM 表示回車,等價
cJ 表示換行,等價
不得不跳出來說說win與linux環境下的行尾了,CRLF即rn是在win下,而linux是LF。這也是為什麼linux下寫程式碼複製到win下換行都不見了的原因。
group and lookaround
這部分比較難,
Groups allow you to combine a sequence of tokens to operate on them together. Capture groups can be referenced by a backreference and accessed separately in the results.
Lookaround lets you match a group without including it in the result.
請再去菜鳥語法看看試著理解上面那段鳥語的意思。
(ABC) 形成一個子串再進行運算
1 反向引用
剩下感覺用處不大
反向引用用法
Example
正則: (w)a1
源: hah dad bad dab gag gab
結果: hah dad gag
解釋: 這個串匹配三個字元,第一個w的意思看上面,a就是字母a,1表示引用第一個匹配到子串;所以最終應該是 BAB這種形式,或者 abcacb這種則會把cac標紅.
重複/限定符
正則運算子優先順序
認識完符號和一些基本的注意點(轉義、反向引用、範圍、從左到右解讀)後,看看
資源安利
未完待續….