[PERL] 14-進階比對#1--取回比對內容 - 精讚
文章推薦指數: 80 %
$email 是被比對的變數,注意這裡的@前面有一個脫逸字元'\',是因為@在雙引號字串中會被當成陣列,所以一定要加上,如果是單引號字串就不必加。
現在日期2022/10/23星期日
Togglenavigation
現在日期2022/10/23星期日
最新文章[札記]2022.10~12月札記
最新消息開始發表有用的蚊蟑和黴體
數位休閒動漫影音遊戲愉樂網路和服務APACHEMYSQL/Mariadb電腦網路資訊網路協定/設定作業系統WindowsCentosLINUXFreebsdMACIOSunix-like應用其他OS前端程設HTML/CSSJquery/JSFlash/繪圖後端程設PHPopenCV+PythonJAVAPERLC#作者廢言作者碎碎念作者吱吱叫作者喃喃語維修記錄經濟學視野
主題
標準
時間線
更多發現
[無邊框]
精讚新精讚首頁
後端程設PERL
[PERL]14-進階比對#1--取回比對內容
4540
[PERL]14-進階比對#1--取回比對內容
“perl的正規表達式進階比對„
分享此文連結//n.sfs.tw/11715
分享連結[PERL]14-進階比對#1--取回比對內容@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-2514:07:12最後編修
2017-08-2710:02:23By張○○
自動目錄
取回比對的內容取回比對的內容同時也加入比對整篇文章中的文字搜索
在04-基本比對中有提過了基本的比對,此篇更深入一點。
取回比對的內容
如果想取得比對的結果,使用小括號'()',取回符合的內容用$1,$2,$3,...:
舉例而言,如果我們想要取回email中的@前面的username和@後面的domainname:
$email="server\@n.sfs.tw";
$email=~/([^@]+)\@(.+)/;
print$1;#server
print$2;#n.sfs.tw
print$&;#[email protected]
$email是被比對的變數,注意這裡的@前面有一個脫逸字元'\',是因為@在雙引號字串中會被當成陣列,所以一定要加上,如果是單引號字串就不必加。
=~符合比對運算子
/([^@]+)\@(.+)/比對的樣式說明如下
()小括號中的內容是要取出符合的內容
[]中括號是符合其中字元的集合
^@在中括號一開始加上這個符號代表是「否定」的意思,全部的意思是只要不是'@'都行
+代表出現1個以上
\@因為在樣式裡面也是能放變數,所以前面加上脫逸字元'\'來確保要比對的是符號'@',如果沒加'\',PERL會判斷這個陣列變數是否存在,有存在就會置換成該變數;不存在時就當成是一般字元處理,有時也許會造成錯誤。
()小括號中的內容是要取出第二個符合的內容
.代表任一個字元
+代表出現1個以上
因此如果$email符合比對的樣式,第3行和第4行用特殊變數$+數字依序取回符合的內容。
PERL用$1,$2,$3,$4....是以小括號的左邊出現次序,依序取回符合的內容。
$&代表比對成功的部分,這是PERL的特殊變數。
另外,
$`代表比對到的字串之前半段所有字串
$'代表比對到的字串之後半段所有字串
例如我們取出IP中每個字節的數字
$ip='211.75.194.243:8080';
$ip=~/((\d+)\.(\d+)\.(\d+)\.(\d+)):(\d+)/;
print"$1,$2,$3,$4,$5,$6\n";#211.75.194.243,211,75,194,243,8080
可以看到$1是第一個左括號的範圍。
上面的程式要做一點調整,因為有時比對不成功的話$1=$2=$3=...=''會是空字串,必須加上判斷
$ip='AAA.75.194.243:8080';
if($ip=~/((\d+)\.(\d+)\.(\d+)\.(\d+)):(\d+)/){
print"$1,$2,$3,$4,$5,$6\n";
}else{
print"比對失敗\n";
}
這樣就能做錯誤控制。
取回比對的內容同時也加入比對
有時我們需要把比對成功的字串同時再比對,例如要找出有連續字元的單字,例如look,snoop,peer,employee符合條件。
這時就需要用到特殊變數\1,\2,\3,...,和$1,$2,$3不同的地方在於它們只能放在樣式之中,來看看範例。
@words=qw(usuallypositivefloorfleeeelscountry);
foreach(@words){
if($_=~/([a-z])\1/){
print$_."\n";
}
}
第4行利用\1將第一個比對符合的小括號再次比對,來檢查重覆出現的字元。
結果
usually
floor
flee
eels
整篇文章中的文字搜索
上面學到了怎麼取出具有重覆字元的單字,如果是整篇文章要取資料。
來看範例:
$doc=<Reportseqtranslationbugsto
()小括號中的內容是要取出符合的內容
[\w]+小號內代表有1個字元以上
\1當第1個小括號比對符合時,再拿來比對,表示連續出現的字元
[\w]*代表\w出現0個字元以上,當出現0個時,重覆字元會在單字後面出現。
第14行是印出全部比對的範圍。
在樣式的最後面有一個字元'g',這並不是打錯,而是稱之為「修飾子」的字元,這算是一個比對位置指標,下次的比對會從上一次比對符合的目標下一個字元找起。
千萬不能省略這個g,省略的話會掉入無窮迴圈中。
有關於更多修飾子的內容會在下一篇說明。
結果
omitted
omitted
smaller
current
usually
smaller
usually
all
http
www
http
有人會問,如果把第13行改成
while($doc=~/([\w])\1/g){
不就剛好能找出兩個連續的字元了嗎,為什麼還有多旁邊的[\w]*,理由很簡單,因為那樣的輸出結果會是:
tt
tt
ll
rr
ll
ll
ll
ll
tt
ww
tt
你不會知道那是什麼字。
上一篇13-變數的視界
回到目錄01-撰寫第一隻PERL程式
下一篇15-進階比對#2--使用更多修飾子
END
你可能感興趣的文章
[PERL]]find和perl的結合--大量檔案中文字的取代利用PERL作大量的文件取代
[PERL]16-字串取代和置換Perl字串比對及置換
[PERL]Regex字元集(群組)幾個Perl在regularexpress會用到的特殊符號notation:字元集
[PERL]06-運算子#2PERL的運算子介紹,總共有21種
[PERL]07-陣列#1--基本perl的陣列
PERL一次讀取檔案所有內容的方法($/)perl可以使用slurpmode一次讀完檔案所有內容的方法及一些範例
我有話要說
>>
姓名*
EMAIL*
留言內容*
我是人類*
限制:留言最高字數1000字。
限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。
訪客留言
[無留言]
隨機好文
[jQuery]利用load()來達成ajax的寫法jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..
談借錢人借錢時手心向上頭向下,人還錢時手心向下頭向上
[jQuery]select元件的取值及給值html中的元件select,在jquery中要如何使用?
[Freebsd]使用ADSL撥接上網Freebsd上要使用ADSL撥接上網,該如何設定?
PHPforsphinx函式庫安裝PECL/sphinxPHP>=5.2.2已經能原生支援sphinx,可是預設的沒有裝,我們得自己裝才能用
取回比對的內容取回比對的內容同時也加入比對整篇文章中的文字搜索
到最頂端
到中間
到最底端
延伸文章資訊
- 1精簡扼要的Perl 課程講義(六):常規表達式(Regular ...
常規表達式(一) (Regular expression) # (1) 基本樣式比對"=~" 與"!~" # 比對字串,成功傳回true # 失敗傳回false "Hello World" =~...
- 22-3 數值和字串的互換與比較
但在其他少數情況下,數值和字串的通用性可能導致程式的錯誤,此時就需要程式設計者的介入。 以下是Perl 的比較運算元(Comparison Operators):. 比較運算說明, 用於數值 ...
- 3Perl 常用的regexp 規則列表 - 朝陽科技大學
搜尋, 精確列印(不要前後文): perl -ne 'print "$1\n" if /..(..)../' 效果約略等同於 grep -Po '..' (但grep 無法print 指定僅印比...
- 4Perl的基本語法
# 不用再指定變數的data type,這樣不是比printf()方便多了嗎? print "Scalar value is $x\n"; # . 是字串加法的運算子,上下這兩行是等效 ...
- 5[PERL] 04-基本比對@新精讚
字串比對是PERL最大的功能和利器,它有一組獨特的運算子:. =~ 比對符合 !~ 比對不符合. 在學習比對時,對於正規表達式Regular Expression得多多著墨 ...