Perl語言入門筆記 第八章 用正規表示式進行匹配

2021-09-30 12:35:32 字數 3437 閱讀 1628

#用正規表示式進行匹配

=pod

m// = // = m%%,m||,m<>,m{},m(),匹配的時候根據需要寫自己的定界符,像qw省略雙引號定界符一樣

模式匹配修飾符:

跟在定界符後面的,//x,x就是模式匹配修飾符

i 忽略大小寫

s 匹配任意字元

if(/barney.*fred/s){}#s會把//裡面的.全部替換為[\d\d],這是需要再讓.匹配除\n以外的字元時,需要把.換成[^\n]或[\n]

x 忽略空白,如/-?[0-9]+ \.? [0-9]* /x,這其中的空格被無視,加入需要的話可以再空格前面加上\,或著空格以\s*或\s+代替

組合選項修飾符:

if(/barney.*fred/is)

if(msix) {}

選擇一種字元解釋方式:

/\w+/a #僅僅是a-z、a-z、0-9、_這些字元

/\w+/u #任何unicode當中定義為單詞的字元

/\w+/l #類同於acsii的版本,但單詞字元的定義取決於本地化設定

#所以如果設定為latin-9的話

其他選項:

錨位:perl5

\a: 匹配字串的絕對開頭

mi #判斷字串是否以https開頭

\z: 匹配字串的絕對末尾,\z後面再沒其它東西

mi #匹配以.png結尾的字串

\z: 行末錨位,它允許後面出現換行符

while()

; /\a\s*\z/:匹配乙個空行

錨位:perl4

^:脫字元開頭錨位

$:結尾錨位 ->行末

匹配多行行末是fred的字串

/fred$/m

匹配單行最好用,\a,\z

單詞錨位:

\b: 只匹配以\w開頭或結尾,只匹配字元[0-9a-za-z]

/\bhunt/:匹配hunt hunting hunter,而不匹配shunt

/stone\b/:匹配standstone flintstone但不包括capstones

\b: 非單詞邊界錨位是\b,它能匹配所有\b不能匹配的位置

/\bsearch\b/會匹配searches、searching與searched,但不匹配search或researching #####沒看懂啥意識,和\b有啥區別

繫結操作符=~:

預設情況下模式匹配的操作物件時$_,繫結操作符告訴perl,拿右邊的模式來匹配左邊的字串,而不是匹配$_

如:if($some_other =~ /\brub/)

快消型別:my $likes_perl = (=~ /\byes\b/i);#判斷輸入的資料中是否有yes子串,有的話,$likes_perl為1,否則為0

模式的內插:

即可插入變數,當做查詢的引數

while(<>) }

my $what = shift @ar**;

如果第乙個命令列引數是fred|barney,則模式會變成/\a(fred|barney)/,也就是會在每行的開頭尋找fred或barney。

捕獲變數:

圓括號出現的地方一般都會觸發正規表示式引擎捕獲匹配到的字串,捕獲組會把匹配圓括號中模式的字串儲存到相應的位置,如果不止乙個括號,就不止乙個捕獲組。每個捕獲組包含的都是原始字串中的內容,而不是模式本身。我們可以通過反向引用取得這些捕獲內容,但也可以再匹配操作結束後立即通過相應的捕獲變數取得這些內容。

因為有了捕獲變數,我們才得擁有提取字串中某些特定部分的能力。

if(/\s(\[a-za-z]+),/) #$1

if(/(\s+) (\s+) (\s+)/) #$1, $2, $3

捕獲變數的存續期:

儲存到下次匹配成功為止,再匹配成功則會將上次匹配的結果給覆蓋掉。

如果想在數行之外使用捕獲變數的話,最好將$1...賦給乙個變數,這樣也能增加程式的可讀性,如my $wilma_word = $1;

不捕獲模式:?:

if(/(?:bronto)?saurus(steak|burger))#?:告訴bronto的圓括號只是為了分組才存在的。那麼存在$1中的就是第二個括號裡的steak|burger

命名捕獲:

if($name =~ m/(\w+)(and|or)(\w+))#現在能匹配了

my $name = 'fred or barray';

if($names =~ m/(?\w+)(?:and|or) (?)\w+/)

print "i saw $+ and $+";

my $name = "fred filnstone and wilma filntstone";

if($names =~ m/(?\w+/) and \w+ \g/)

"};自動捕獲變數:

$&, $`, $'

if("hello there, neighbor" =~ /\s(\w+),/)

; 匹配到的結果放到$&裡,匹配區段之前的內容會存到$`裡,而匹配區段之後的內容則會存到$'裡,將三者依次連線起來,就一定會得到原來的字串。

一旦使用了某個自動捕獲變數,其他正規表示式的執行速度會變慢。

use 5.010;

if("hello there, neighbor" =~ /\s(\w+),/p)

'.\n";

} if("hello there, neighbor" =~ /\s(w+),/p)

)($)($).\n";

} 上面三個和$`,$&,$'是等價的

通用量詞:

/a/匹配a 5到15次

/(fred)/匹配fred 3到無限次

/\w/匹配w 8次

模式測試程式:

#!/usr/bin/perl

while(<>)

else

}=cut

簡單練習:

#!/usr/bin/perl

=pod

while(1)

else }

=cut

=pod

while(1)

else }

=cut

=pod

#ex8_3

while()

else }

=cut

=pod

use 5.010;

while()

\n'"; #新的輸出行

} else }

=cut

=pod

#ex8_5

m! (\b\w*a\b) #$1: 某個以字母a結尾的英文單詞

(.) #$2: 後面接上的字元不超過5個

!xs #/x和/s修飾符

=cut

#ex8_6

while(<>) }

system "pause";

第八章(筆記)

能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

C語言 第八章

這一章沒有怎麼仔細看,其實也很簡單,記住格式就行了。等不會的時候可以翻書看一下就ok了。到此為止,譚浩強的這本書已經看完一遍了,找到了10個左右的錯誤,感覺有點驚訝。後天c語言的聖經就買回來了,到時候再認真看看那本吧 評價極高啊 聖經orz 一 c語言的標準 i o庫中定義了3個 file 型指標 ...