此篇系讀《正規表示式必知必會》後個人對正則的理解和學x總結,正規表示式在waf中或者siem日誌分析等專案中扮演了非常重要的角色,個人認為是研究bypass和日誌分析的基礎,以此為基礎後面可能還會寫寫mod security crs的解析。
簡介正規表示式(regular expression, regex)是一種工具,簡而言之就是匹配字串的一串符號,常用來模糊查詢,校驗輸入的合法性等。
單個字元匹配
純文字如my
其實本質上也是正規表示式
這樣匹配出來有兩個結果,但大多數正則預設是只返回第乙個匹配,想要全域性匹配一般都是返回陣列或者其他專用格式。
正則區分大小寫,比如ben不匹配ben, 忽略大小寫匹配一般可以用i引數。
.
可以匹配任意字元(換行符除外的字母、字元、數字),如c.t 可以匹配cat和cot
匹配正規表示式中有特殊含義的符號需要用到轉義字元,如匹配.
本身可以使用表示式\.
匹配一組字元
裡面的內容可以匹配其中乙個字元,如
[ns]
可以匹配n或者s
裡面的內容可以匹配字元區間,如
[0123456789]
和[0-9]
是等價的,[a-za-z0-9]
可以匹配任意字母和數字
^
可以表示取非匹配,如[^0-9]
表示非數字的集合
元字元元字元是正則中含有特殊含義的字元,比如.
表示匹配任意字元,[
表示字元集合的開始,匹配元字元時就需要用到轉義字元,如匹配資料表示式array[1]的正規表示式要寫作array\[1\]
匹配空白字元,\s
可以匹配任何乙個空白字元(等價[\f\n\r\t\v]
),\s
可以匹配任何乙個非空白字元(等價[^\f\n\r\t\v]
)
元字元匹配數字,\d
可以匹配任意乙個數字字元,\d
可以匹配任何乙個非數字字元
元字元匹配字母和數字,,\w
可以匹配任意乙個不分大小寫的字母數字字元或下劃線,\w
可以匹配任意乙個非不分大小寫的字母數字字元或下劃線
元字元匹配十六進製制和八進位制數值,如、0x0a對應與ascii字元10(換行符號),效果等價於\n
, 八進位制使用字首\0
posix字元類是許多(但不是所有,如js不支援)正規表示式都支援的簡寫形式
重複匹配
匹配乙個或者多個字元的重複加上+
字元就可以了,+
匹配乙個或者多個字元(至少乙個),如[0-9]+
匹配乙個或多個連續的數字
匹配零個或多個字元,可以使用*
, 如\w+[\w]*
可以匹配大小寫字母數字或者下劃線開頭的字串
匹配零個或乙個字元,可以使用?
,?
之作用於其前乙個字元或者集合。如要匹配url, 可能有http的,也有https的。完全匹配這樣的開頭就可以使用https?
匹配確定的重複次數可以使用,如匹配長度為4的16進製制數表示式
[0-9a-fa-f][0-9a-fa-f][0-9a-fa-f][0-9a-fa-f]
非常長,可以寫為[0-9a-fa-f]
匹配次數可以設定區間,如[0-9a-fa-f]
表示0-6位的16進製制數
匹配「至少重複多少次」,如找出位數大於3的數字可以用\d
表示
防止過度匹配(貪婪表示式和懶惰表示式)
如有一段字串
>
hellop
>
and
>
world!p
>
使用正規表示式
中的.*
其實匹配的是hello
and world!
。因為*和+都是所謂的「貪婪型」元字元,這些元字元匹配模式是多多益善而不是適可而止的。如果不想用這些原字元的貪婪模式怎麼辦?可以在其後面加上?
來實現最小匹配,對應關係如下:
貪婪型元字元
懶惰型元字元**?
++?位置匹配
位置匹配是解決在什麼位置進行字串匹配的問題
單詞邊界空格符號\b
, 如\bcat\b
在句子「the cat scattered his food all over the room」中匹配cat但是不匹配scattered;如\b-\b
匹配pass-key但不匹配兩頭為空的-
符號
字串邊界,^
用在裡面表示非,也可以匹配字串開頭,如
^\s*
也可以匹配,使用回溯寫正則可以寫為為
.*?
回溯匹配也常用來做替換,js中回溯使用符號$
回溯可以用來做大小寫替換,正則中有用來做大小寫轉換的元字元
前後查詢
有些時候通過正則匹配的出的字串只有一部分是我們想要的內容,但又不得不通過一段前後連線的特徵來定位,如取html的title欄位hello
, hello是我們想要的,但沒有是沒法定位匹配的。這裡當然可以用前面的子表示式回溯的方式來取值,但同時取
這標籤即浪費時間也毫無意義。這時前後查詢的作用就凸顯出來了。
向前查詢是以?=
開頭的子表示式,需要匹配的文字跟在=的後面。如取url裡的協議名可以使用正規表示式
.+(?=:)
向後查詢的操作符是?<=
(記為箭頭指向文字閱讀方向的後方),如要取$99.99
中的99.99而不想取到$符號,可以使用表示式(?<=\$)[\d.]+
向前向後查詢結合,如(?<=()).*(?=())
就匹配到hello
中的hello
對前後查詢取非,這個很少用到了
嵌入條件
嵌入條件只可能出現在兩種情況:根據回溯引用進行條件處理或者根據前後查詢來進行條件處理。
在條件裡。回溯引用編號不需要被轉義,如(]+>\s*)?]+>(?(1)\s*)
, 這段正則的意思是匹配img標籤,如果img標籤在a標籤裡面則連開頭的a標籤一起匹配,?(1)
檢查第乙個回溯引用是否存在,條件滿足才執行後面的表示式。
fei 正規表示式 正規表示式小結
常用的元字元常用的反義 常用的限定符 語法 說明 語法 說明 語法 說明 w 匹配字母或數字或下劃線或漢字 w匹配任意不是字母 數字 下劃線 漢字的字元 重複零次或者更多次 s匹配任意的空白字元 s匹配任意不是空白符的字元 重複一次或更多次 d匹配數字 d匹配任意非數字的字元 重複零次或一次 b匹配...
正規表示式小結
正規表示式 regex 英 red eks 1,d d d d或者是 d 表示匹配4位數的數字。2.說明。這些可被稱作元字元。匹配除換行符以外的任意字元1 jk2yh jj w數字字母漢字下劃線 bst456 5ghgtft s匹配任意的空白符 space table鍵和半全形空格 d匹配數字 di...
正規表示式小結
最近學習了正規表示式,趁還熱乎,寫下這篇部落格,記錄一下。正規表示式 英語 regular expression,在 中常簡寫為regex 正規表示式是乙個字串,使用單個字串來描述 用來定義匹配規則,匹配一系列符合某個句法規則的字串。在開發中,正規表示式通常被用來檢索 替換那些符合某個規則的文字,也...