本文分享自天翼雲開發者社區《perl正則語法總結》.作者:李****壯
一、介紹
正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。Perl語言的正則表達式功能非常強大,基本上是常用語言中最強大的,很多語言設計正則式支持的時候都參考Perl的正則表達式
二、語法
2.1 元字符
| 字符 | 説明 |
| . | 匹配除換行符以外的任意字符 |
| \w | 匹配任何單詞字符,包含字母或數字或下劃線 |
| \W | 匹配任何非單詞字符 |
| \s | 匹配任意的空白字符,包含空格、製表符、換頁字符 |
| \S | 匹配任何非空白字符 |
| \d | 匹配數字字符 |
| \D | 匹配非數字字符 |
| \f | 匹配換頁字符 |
| \n | 匹配換行符 |
| \r | 匹配回車字符 |
| \t | 匹配跳進字符 |
| \v | 匹配垂直跳進字符 |
| \A | 不區分單行多行模式,僅匹配字符串的開頭。 |
| ^ | 單行模式匹配下,匹配字符串的開始。多行模式,匹配每一行的字符串開始 |
| \z | 不區分單行多行模式,匹配字符串的結束 |
| $ | 單行模式匹配下,匹配字符串的結束。多行模式,匹配每一行的字符串結束 |
| \b | 匹配某個單詞邊界,即,某個單詞和空格之間的位置。例如,st\b 匹配 test 中的 st,但是不匹配 testa 中的 st |
| \B | 匹配非單詞邊界 |
| \ | 取消元字符的轉義 |
2.2 重複
| 代碼 | 説明 |
| * | 重複零次或更多次 |
| + | 重複一次或更多次 |
| ? | 重複零次或一次 |
| {n} | 重複n次 |
| {n,} | 重複n次或更多次 |
| {n,m} | 重複n到m次 |
| <數量詞>? | <數量詞>指的是 、?等上述表格表達數量的字符,? 使、+、?、{} 變成非貪婪模式。例如*?、?? |
2.3 邏輯、分組
| 代碼 | 説明 |
| () |
分組,並按( 出現的順序依次賦值給匹配後的值,$n,n從1計數 示例: 字符串: aabbcc 正則表達式:((aa)(bb))cc 取值: $0: aabbcc $1: aabb $2: aa $3: bb |
| (?:...) |
()的不分組版本,()內的匹配不編號 |
| | | |代表左右表達式任意匹配一個
它總是先嚐試匹配左邊的表達式,一旦成功匹配則跳過匹配右邊的表達式。 如果|沒有被包括在()中,則它的範圍是整個正則表達式 |
| [] | 字符集(字符類)。對應的位置可以是字符集中任意字符。
字符集中的字符可以逐個列出,也可以給出範圍,如labc]或 [a-c]。第一個字符如果是^則表示取反,如[^abc]表示不是 abc的其他字符。 所有的特殊字符在字符集中都失去其原有的特殊含義。在字 符集中如果要使用]、-或^,可以在前面加上反斜槓,或把] -放在第一個字符,把^放在非第一個字符。 |
| (?P<name>...) | 分組,除了原有的編號外再指定一個額外的別名。例如(?P<id>abc) |
| \number |
引用編號為number的分組匹配到的字符串, 例如 (\d)test\1 可以匹配 1test1 但不匹配 1test2 |
| (?P=name) |
引用別名為<name>的分組匹配到的字符串 例如 (?P<id>\d)test(?P=id) 可以匹配 1test1 ,但不匹配 1test2 |
2.4 斷言
| 代碼 | 説明 |
| (?iLmsux) |
iLmsux的每個字符代表一個匹配模式,只能用在正則表達式的開頭,可選多個 iLmsux 可以為 i, L, m, s, u, x
i: 忽略大小寫
L: 字符集本地化,為了支持多語言版本的字符集使用環境 u: 使用\w,\W,\b,\B這些元字符時將按照UNICODE定義的屬性 m: 多行模式,改變 ^ 和 $ 的行為 s: '.' 的匹配不受限制,包括換行符 x: 冗餘模式,可以忽略正則表達式中的空白和#號的註釋 例如 (?i)aaa
|
| (?#...) | #後的內容將作為註釋被忽略 |
| (?=...) |
之後的字符串內容需要匹配表達式才能成功匹配,不消耗字符串內容 例如 a(?=b) 匹配 ab中的a ,不匹配 ad |
| (?!..) |
之後的字符串內容需要不匹配表達式才能成功匹配,不消耗字符串內容。 例如 a(?!b) 匹配 ad中的a ,不匹配 ab |
| (?<=....) |
之前的字符串內容需要匹配表達式才能成功匹配,不消耗字符串內容。 例如(?<=a)b,匹配ab 中的b ,不匹配 cb |
| (?<!....) |
之前的字符串內容需要不匹配表達式才能成功匹配,不消耗字符串內容。 例如(?<!a)b,匹配cb 中的b ,不匹配 ab |
| (?(id/name)yes-pattern|no-pattern) |
如果編號為id/別名為name的組匹配到字符,則需要匹配yes-pattern,否則需要匹配no-pattern,no-paternn可以省略。 例如 ^(\()?[^()]+(?(1)\))$ 如果開頭是 ( ,結尾必須是 ) |