一:模式匹配中的特殊字符正則表達式
1: 點號 .函數
匹配任何單個字符(換行符\n除外)ui
2: 反斜線 \spa
轉義字符,用於特殊符號前,使其失去特殊字符的做用變成普通字符命令行
3: +debug
匹配該字符前面的字符(單個)至少一次;1次,2次...n次3d
4: *對象
匹配該字符前面的字符任意次:0次,1次...n次blog
5: ?字符串
匹配該字符前面的字符0次或者一次
6: .*
匹配任意字符任意次(換行符除外)
7: {count}
匹配前面的字符count次
8: {min,}
匹配前面的字符至少min次
9: {min,max}
匹配至少min,至多max
10: *?
匹配該字符前面的字符任意次:0次,1次...n次,傾向於短字符,非貪婪量詞
11: +?
匹配該字符前面的字符(單個)至少一次;1次,2次...n次,傾向於短字符,非貪婪量詞
12: ()
模式分組字符 eg:/(perl)+/ #有()匹配模式是perl,沒有括號,匹配模式是單個字符l;
1)藉助模式分組,可使用\number的方向引用來引用括號內匹配的內容,n和括號內的組號匹配
2)perl 5.10可使用\g{number}這種形式的反向引用,n能夠爲負數
輸出:
13: |
或,即匹配左右均可
14: 例子
輸出:
二: 字符集
字符集是指一串可能出現的字符集合。經過寫在方括號([ ])內來表示。只能用來匹配單個字符,但能夠是方括號內列出的任意一個
輸出:
1: 可使用字符 - 進行簡寫; [0-9]表示0到9十個數字
2: 可使用脫字符 ^ 匹配字符集外的字符
3: 字符集簡寫
說明:\d 匹配任意的數字, \w匹配任意的字母數字下劃線 ,\s匹配任意的空格,
4: 例子
輸出:
問題:test_id = 20010的\w\s+匹配一個字符多個空格;按道理匹配不了啊,但輸出匹配成功
5: 經常使用字符集
/[\dA-Fa-f]+/ :匹配16進制數
/\d\D/ :匹配任意字符
/^\d\D/ :什麼字符都不匹配
四: 模式匹配操做符與修飾符
1: 操做符
在前面的介紹與例子中,咱們使用 // 來進行匹配(其實是m//);
模式匹配操做符可使用任意成對的定界符,當使用斜線做爲定界符時,開頭的m能夠省略
eg:m(fred),m<fred>,m{fred},m[fred]
m%http://%
2: 修飾符(在操做符後面,其實與操做符的/符號合用)
1)/i
進行模式匹配時,將不區分大小寫
2)/s
模式中的點號將匹配包括換行符在內的任意字符(注意與\s區分開來,\s是字符集裏匹配任意的空格的簡寫)
3)/x
忽略空白符,使用/x修飾符能夠在模式裏面隨意加上空白,使其更容易閱讀。
五: 錨位
1: ^
標誌字符串的開頭
2: $
標誌字符串的末尾,eg:/^\s*$/
3: /b 指定特定的單詞
單詞(\w+)錨位,匹配任何單詞的收尾
4: /B
非單詞錨位,匹配全部/b不能匹配的位置
5: 例子
輸出:
六: 綁定操做符=~
默認狀況下,模式匹配的對象的$_,綁定操做符=~用於告訴perl拿右邊的模式匹配左邊的字符串,而不是匹配$_變量中的字符串
七: 模式串中的變量內插
例如:
my $val = "just";
my $val2 = "This is just a test example";
if ($val2 =~ /($val)/) { .... } #正則表達式中的變量內插,if ($val2 =~ /$(val)/)也可。
八: 捕獲
把圓括號內的字符串暫時記憶下來的能力,若是有多個圓括號,就有多個捕獲。捕獲變量都是標量變量,依次爲$1,$2...$n
1: 捕獲週期
捕獲變量一般能存活到下次成功的模式匹配爲止,即失敗的匹配不會改動上次工程匹配時捕獲的內容,而成功時會將它們重置。若是在數行以外使用捕獲變量,最好將捕獲變量的值復 制到一個通常的變量裏
輸出:
2: 不匹配模式
通常狀況下,模式使用的圓括號都會捕獲部分的匹配串到捕獲變量中,但若perl正則表達式容許使用括號但不作捕獲(不捕獲括號),須要在左括號的後面加上問號和冒號(?:)。
3: 命名捕獲
管理$1,$2...是比較困難的,尤爲是對比較複雜的正則表達式而言。Perl5.10引入了正則表達式命名捕獲的概念。
在命名捕獲中,捕獲結果保存在%+的特殊哈希中;模式加標籤的寫法是(?<LABEL>PATTERN),訪問爲$+{LABEL},可以使用\g{LABEL}或\k{LABEL}反向引用。
例子:
輸出:
4: 自動匹配變量
$&:匹配括號的內容;$`:匹配內容前的字符;$’:匹配內容後的值(包括空格逗號等)
九: 替換
1: s///
前兩個//裏是要替換的字符,後兩個//裏是替換的字符;返回布爾值,替換成功時爲真;只替換一個值
2: /g
全局替換;常寫在s///後面,/g的斜線省略
輸出:
3: 不一樣的替換界定符
和m//同樣,s///操做符也可使用其餘的定界符
1)使用沒有左右之分的非成對符號,跟s///同樣,只需重複三次便可;eg:s#Barney#Fred#
2)使用有左右之分的成對符號,必須使用兩對,一對圈引模式,一對圈引替換模式。圈引模式與圈引替換模式不必定要相同
eg:s{barney}{fred};s[barney][fred];s<fred>#barney#
4: 替換修飾符
/g(全局替換)
/i,/s,/x (四(2)同)
/m 使模式匹配字符串內的換行符
5: 大小寫轉換
例子:
輸出:
十: split操做符
根據指定的分隔符拆開一個字符串,返回子串的列表(即將一個字符串分解爲多個)。尤爲適用於處理被製表符,冒號,空白或其餘符號分割的數據
1: 語法規則
@split = split /separator/,$string or @split = split( /separator/,$string)
split會保留開頭處的空字段,並省略結尾處的空字段
2: 例子
輸出:
說明:多餘的冒號會被當成空字符
十一: join函數
將多個字符串片斷合併成一個字符串
my $result = join $glue,@pieces; or my $result = join ($glue,@pieces)
輸出:
十二: 列表上下文中的m//
通常狀況下,模式匹配操做符m//返回的是布爾值,若是在列表上下文中使用模式匹配操做符,將返回全部捕獲變量的列表
eg:my $test = "hello,there,neighbor";
my ($first,$second,$third) = ($test = ~ /(\S+) (S+), (S+)/); 大寫S是小寫s補集。
十三: 命令行執行perl
perl -p -i.bak -w -e 's/Randall/Randal/g' fred*.dat
十四:debug perl腳本
1)在程序頭添加-d或者在終端perl -d filename.pl;打開debug模式
2)DB<1> l :list the next few lines;p $variable name: 輸出變量值; q:quit;
r:從子函數中返回; R:再次運行; n:單步執行,不進入子函數(F10)
s:單步執行(F11),進入子函數;
b:放斷點,如b 20 在第二十行放斷點 ; c:運行到第一個斷點處