1. 程式人生 > >5分鐘輕鬆學正則表示式

5分鐘輕鬆學正則表示式

# 正則表示式是什麼? 正則表示式,是一個表示式,用少量的簡單字元,來表示複雜的長字串。 實際工作用到很多,比如日誌搜尋、查詢替換、JMeter 響應資料提取等。 先看一個例子,使用者名稱包含字元、數字、下劃線和連字元,並限制字元的個數:
這個表示式可以接受 `john_doe`、`jo-hn_doe`、`john12_as`,但是無法匹配到 `Jo`,因為它包含了大寫的字母而且太短了。 # 字元匹配 正則表示式之所以強大,是因為通過一些特殊字元,能讓它匹配到更多字串。 ## \. 匹配任意單個字元除了換行符。 例:\.ar => The car parked in the garage. ## \[ \] 字符集。匹配方括號內的任意字元。並且字元是無先後順序的。 例:[Tt]he => The car parked in the garage. 方括號的句號就表示句號。 例:ar[.] => A garage is a good place to park a car. ## \[^ \] 否定的字符集。匹配除了方括號裡的任意字元。 例:\[^c\]ar =>
The car parked in the garage. ## \* 匹配 >= 0 個重複的在 \* 號之前的字元。 例:a\* => babaa123. 例:[a-z]* => The car parked in the garage #21. `*` 字元和 `.` 字元搭配可以匹配所有的字元 `.*`。 ## + 匹配 >= 1個重複的 + 號前的字元。 例:c.+t => The fat cat sat on the mat. ## ? 標記 ? 之前的字元為可選,即出現 0 或 1 次。 例:\[T\]?he => The car is parked in the garage. ## \{n,m\} 匹配 num 個大括號之前的字元或字符集 (n <= num <= m)。 例:[0-9]{2,3} => The number was 9.9997 but we rounded it off to 10.0. 可以省略第二個引數,表示至少。 例:[0-9]{2,} => The number was 9.9997 but we rounded it off to 10.0. 逗號也省略掉則表示重複固定的次數。 例:[0-9]{3} => The number was 9.9997 but we rounded it off to 10.0. ## (xyz) 字符集,匹配與 xyz 完全相等的字串,括號內的被視為一個整體。 JMeter 中,通過小括號來提取字串中的子字串。 例:"token":"(.\*?)","expired_at" => "token":"123","expired_at" ## \| 或運算子,匹配符號前或後的字元。 例:"(T|t)he|car" => The car is parked in the garage. ## ^ 字串開頭。 例:"^(T|t)he" => The car is parked in the garage. ## $ 字串結尾。 例:"(at\.)$" => The fat cat. sat. on the mat. ## 轉義 對於正則表示式的這些特殊字元: ``` { } [ ] ( ) / \ + * . $ ^ | ? ``` 如果需要匹配,那麼需要使用反斜槓 `\` 進行轉義。 例:"(f|c|m)at\\.?" => The fat cat sat on the mat. # 簡寫字符集 | 簡寫 | 描述 | | ---- | ------------------------------------------------------------ | | . | 除換行符外的所有字元 | | \w | 匹配所有字母數字,等同於 `[a-zA-Z0-9_]`,**w是word首字母** | | \W | 匹配所有非字母數字,即符號,等同於: `[^\w]` | | \d | 匹配數字: `[0-9]`,**d是digital首字母** | | \D | 匹配非數字: `[^\d]` | | \s | 匹配所有空格字元,等同於: `[\t\n\f\r\p{Z}]`,**s是space首字母** | | \S | 匹配所有非空格字元: `[^\s]` | | \f | 匹配一個換頁符 | | \n | 匹配一個換行符 | | \r | 匹配一個回車符 | | \t | 匹配一個製表符 | | \v | 匹配一個垂直製表符 | | \p | 匹配 CR/LF(等同於 `\r\n`),用來匹配 DOS 行終止符 | # 貪婪匹配與非貪婪匹配 正則表示式預設是貪婪匹配,也就是會盡可能多的匹配字串。可以使用 `?` 將貪婪匹配模式轉化為非貪婪匹配模式。 例: 預設貪婪:
使用 `?` 轉為非貪婪:
# 忽略大小寫 不同程式語言寫法不同,比如 Python 可以通過 `re.compile('pattern', re.I)` 來忽略大小寫。 # 線上測試 https://tool.oschina.net/regex/ # 簡要回顧 本文首先通過一個例子介紹了正則表示式是什麼樣子的,接著對字元匹配的特殊字元進行了講解和示例說明,然後給出了簡寫字符集。正則表示式預設是貪婪模式,可以使用 `?` 來轉為非貪婪。也可以新增引數,讓正則表示式忽略大小寫等。最後給出了線上測試正則表示式地址,方便除錯看結果。本文內容已經足夠在工作中使用,更多高階用法可以通過參考資料進一步閱讀。 參考資料: https://en.wikipedia.org/wiki/Regular_expression https://docs.python.org/3/library/re.html https://github.com/ziishaned/learn-regex https://www.cnblogs.com/huxi/archive/2010/07/04/1771