正規表示式小結

2021-10-07 11:43:34 字數 3853 閱讀 2958

此篇系讀《正規表示式必知必會》後個人對正則的理解和學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 正規表示式是乙個字串,使用單個字串來描述 用來定義匹配規則,匹配一系列符合某個句法規則的字串。在開發中,正規表示式通常被用來檢索 替換那些符合某個規則的文字,也...