Perl 學習筆記 正規表示式處理文字

2022-03-15 14:57:48 字數 3689 閱讀 7763

1.使用正規表示式替換文字  s///

s/;/;/ 如果匹配失敗, 則什麼也不會發生, 變數也不受影響. 返回布林值, 替換成功時為真, 否則為假.

$roger = "

this is a text";

$roger =~ s/this (\w+)/this was/;

print

$roger;

$_ = "

green scaly dinosaur";

s/(\w+) (\w+)/$2, $1/; print; printf("

\n"); #

scaly, green dinosaur

s/^/huge, /;print; printf("

\n"); #

huge, scaly, green dinosaur

s/,.*een//;print; printf("

\n"); #

huge dinosaur

s/green/red/; print; printf("

\n"); #

失敗, 不會變

s/\w+$/($`!)$&/;print; printf("

\n"); #

huge (huge !)dinosaur

s/\s+(!\w+)/$1 /;print; printf("

\n"); #

huge (huge!) dinosaur

s/huge/gigantic/;print; printf("

\n"); #

gigantic (huge!) dinosaur

更換定界符: 無左右之分的字元(非成對),重複3次即可, 否則用2對, 一對圈引模式,一對圈引替換字串.  圈引字串定界符合圈引替換定界符不必相同, 如:  s#

roger#loger#;

s;s[roger](loger);

s#loger#;

2.使用/g進行全域性替換

$_ = "

roger, go on roger!";

s/roger/loger/g; #

不重不漏替換所有匹配串

print ;

常用技巧

$_ = "

this is a text that don't beatiful! ";

s/\s+/ /g; #

去掉多餘的空白

print; printf("\n"

);s/^\s+//; #

去掉前導空格

print; printf("\n"

);s/\s+$//; #

去掉末尾空格

print; printf("

\n");

使用修飾符修改大小寫:

\u 將其位置後的所有字元轉換成大寫. \u 將位置後的第乙個字元轉換為大寫

\l 將其位置後的所有字元轉換成小學, \l 將位置後的第乙個字元轉換成小寫.

3.split操作符

split使用正規表示式, 根據分隔符拆開乙個字串, 並返回對應的乙個陣列;  方便用來處理被製表符/冒號/空白/任意符號分隔的資料. 只要能將分隔符寫成模式, 就可以用split提取資料.

用法:  @fields = split //, $string; 如果兩個分隔符連在一起, 就會產生空欄位 ;  split會保留開頭的所有空字段並去掉結尾處的空欄位(如果想要保留, 加上第3個引數並賦值為-1即可).

預設: 使用空白字元分割 $_  ;  相當於  split /\s+/,$_; 但不完全是, 因為它還會進一步省略開頭的空欄位.

4. join函式(膠水操作) -- split的逆操作

join不使用正規表示式, 將它的第乙個引數(字串,而不是模式)作為膠水, 粘接後面其他引數(變長引數)構成的片段. 膠水只會在片段之間使用. 

5.列表上下文中的  m//

收到split的啟發, 分隔符並非真正有用的資料字段, 在列表上下文中匹配時, 如果成功匹配, 可以返回所有捕獲的變數的列表, 匹配失敗, 返回空列表.

$_ = "

hello there, neighbor!";

@roger = /(\s+) (\s+), (\s+)/;

print

$roger[1]; #

there

/g也可以用在m//上

#

將匹配的字串按一前以後組成雜湊, 如 barney rubble都匹配, 返回後barney為鍵,rubble為值

my$data = "

barney rubble fred flintstone wilma flintstone";

my%last_name = ($data =~ /(\w+)\s+(\w+)/g);

print

$last_name."

\n";

6.非貪婪量詞

目前掌握的所有量詞都是貪婪的, 會盡量匹配多的字元, 如果不滿足才返回匹配少的 , 如  .* , 如果要使用非貪婪的量詞,可以在量詞後面加上乙個 ? , 所以非貪婪量詞就有以下這些:  +?

*???

?7.跨行的模式匹配

一般而言,perl中的正規表示式用來匹配單行文字,  由於perl可以處理任意長度的字串,  所以一般沒什麼問題. 現在討論處理多行文字.

表示多行文字: 在乙個字串中加上\n就表示多行文字, 但是匹配字串首尾時並不會在意\n的存在, 因為 ^ 和 $ 匹配的是整個字串的首尾. 要想考慮到\n的存在, 將字串當做多行文本來處理, 就需要在模式後面加上  /m  ,表示(multiple lines), 此時, ^ 和 $ 就表示匹配一樣的首和尾.

open myfile, "

>> a.txt

" or die

"can't open file!\n";

$_ = "

i'm much better\nthan barney is\nat bowling,\nwilma.\n";

if(/^i'

m.*?better$/m)

close myfile;

8.一次更新多個檔案

獲取本地時間,  $date = localtime; 這個可以獲取標準時間字串, 如果直接列印localtime, 將得到時間戳. 也可以用系統的date命令,  $date = `date`

在perl中進行檔案修改可以使用鑽石操作符和特殊的變數  $^i

chomp(my

$date = localtime

);$^i = "

.bak

"; #

這個變數的預設值為undef, 當被賦值為某個字串時, 鑽石操作符就會將自動開啟的檔案進行備份,字尾名加上變數的內容,需要注意的是如果這個變數為空, 就會直接修改原檔案,資料可能會丟失

while(<>)

命令列中:  $ perl -p -i.bak -w -e '

s/author:roger.*/author:roger/g

' a*.dat , 功能和上面相同.

-p 表示生成一段**  while(<>)

-i.bak 表示給變數 $^i賦值為 ".bak"

-w 表示開啟警告

-e 表示有多條語句, 最後一條可省略分號;

perl學習筆記 正規表示式

匹配除換行符以外的所有字元 c.i 找到c後面跟著二個任意字元,再跟著i的字串 x?匹配0次或一次x字串 x 匹配0次或多次x字串,但匹配可能的最少次數 x 匹配1次或多次x字串,但匹配可能的最少次數 匹配0次或一次的任何字元 匹配1次或多次的任何字元 匹配剛好是m個的指定字串 匹配 m個 以上 的...

Perl學習筆記(6) 正規表示式

通用量詞,可以用 表示大於等於1個,表示大於0次,表示0或1次。而通過 指定指定重複次數,比如 可以用 1,表示,用 0,1 替換s pattern replacement 預設是對匹配的第乙個進行替換,如果加上 g可以進行全域性替換,即匹配所有進行替換。split 根據分割符拆分乙個字串為列表。f...

Perl 正規表示式

正規表示式文中列表 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個後向引用 或乙個八進位制轉義符。匹配輸入字串的開始位置。如果設定了 regexp 物件的multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如果設定了 regexp 物件的multiline 屬性...