博客 / 詳情

返回

perl正則語法總結

本文分享自天翼雲開發者社區《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)\))$

如果開頭是 ( ,結尾必須是 )

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.