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)
來忽略大小寫。
在線測試
簡要回顧
本文首先通過一個例子介紹了正則表達式是什麼樣子的,接着對字符匹配的特殊字符進行了講解和示例說明,然後給出了簡寫字符集。正則表達式默認是貪婪模式,可以使用 ?
來轉為非貪婪。也可以添加參數,讓正則表達式忽略大小寫等。最後給出了在線測試正則表達式地址,方便調試看結果。本文內容已經足夠在工作中使用,更多高級用法可以通過參考資料進一步閱讀。
參考資料:
//en.wikipedia.org/wiki/Regular_expression
//docs.python.org/3/library/re.html
//github.com/ziishaned/learn-regex
//www.cnblogs.com/huxi/archive/2010/07/04/1771073.html