[精讚] [會員登入]
1677

[PERL] 04-基本比對

perl的正規表達示基本比對

此文完整連結 http://n.sfs.tw/11660

複製連結 [PERL] 04-基本比對@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-08-29 01:13:02 最後編修
2017-08-20 11:07:13 By 張○○
 

字串比對是PERL最大的功能和利器,它有一組獨特的運算子:

=~ 比對符合
!~ 比對不符合

在學習比對時,對於正規表達式Regular Expression得多多著墨才行,不然寫不出好的比對樣式(Pattern),此篇舉三個基本比對的範例。先看第一個範例:

判斷使用者是不是輸入數字

範例

print "請輸入數字\n";
$line=<STDIN>;
chomp($line);
if( $line =~ /^\d+$/ ){ print "全是數字\n"; }
else{ print "不是全數字\n"; }

第2~3行 <STDIN> 代表等待使用者輸入的字串,會包含換行,因此用chomp來移除行尾的換行

第4行 $line =~ /^\d+$/ 這是PERL的比對寫法,注意並沒有用到雙引號或單引號,拆解後:

  $line 被比對的變數
  =~ 符合比對運算子
  /樣式/ 預設左右兩個斜線作為樣式的邊界,邊界符號是可以修改的,我在進階比對中會再說明,而樣式就是正規表達式的Pattern
      ^ 從字串的最前面開始判斷
      \d 代表1個數字 0~9
      + 代表出現1個以上
      $ 判斷到字串的最後面

 意思就是從字串的第1個字元比到最後一個字元,都必須是數字組成。

執行

$ perl 04.pl
請輸入數字
123456
全是數字
$ perl 04.pl
請輸入數字
123anc456
不是全數字
$ perl 04.pl
請輸入數字
-456
不是全數字
$ perl 04.pl
請輸入數字
123.456
不是全數字

這樣子輸入的字串只要不是全部由0-9所組成,就不符合,但也可以發現,負數和浮點數也不符合,如果要接受所有的數值(正、負、小數)該怎麼改?

判斷是否為數值

上一個範例中的第4,5兩行換成這樣,就能符合我們的需要:

if( $line =~ /^[+\-]?[\d.]+$/ ){ print "全是數值\n"; }
else{ print "非數值\n"; }

  樣式內容 ^[+\-]?[\d.]+$ 部分說明如下:

      ^ 從字串的最前面開始判斷
      [] 中刮號裡面是放字元的清單,意思就是只要出現清單中的任一個字元即可
        [+\-] 表示清單中有一個 '+' 和一個 '-',由於 '-' 這符號在清單中是「連續」的意思,所以加上一個反斜線'\' 指定它為負號 '-'
      ? 問號的作用是他前面的字元可有可無,稱為變換字元
        [\d.] 代表數字和小數點都能接受
      + 代表出現1個以上
      $ 判斷到字串的最後面

執行

$ perl 04.pl
請輸入數字
123456
全是數值
$ perl 04.pl
請輸入數字
123.456
全是數值
$ perl 04.pl
請輸入數字
-123.456
全是數值
$ perl 04.pl
請輸入數字
123abc456
非數值

在某些情況下要使用者輸入帳號,但希望使用者只能輸入小寫的英文、數字和底線_,該怎麼寫。事實上,這裡還存在一個大漏洞,就是如果使用者輸入二個以上的小數點時,這就不會是數值,可是在我們的樣式裡是看不到這樣的限制。

只接受小寫的英文、數字和底線_

使用者只能輸入小寫的英文、數字和底線_作為帳號,同時第一個字元不能是底線或數字,該怎麼寫

print "請輸入帳號\n";
$line=<STDIN>;
chomp($line);
if( $line =~ /^[^_\d][\da-z_]+$/ ){ print "符合\n"; }
else{ print "不符合\n"; }

  樣式內容 ^[^_\d][\da-z_]+$ 部分說明如下:

      ^ 從字串的最前面開始判斷
      [^_\d] 在清單中的第一個字元若出現'^' 表示「相反」的意思,在清單中的字元都不能出現。所以意思是第1個字元不能出現數字\d和底線_
      [\da-z_] 這組清單能接受數字、和小寫a-z、及底線,正如上面提過,清單中的減字號'-'是連續的意思,不能視為一般的減號。
      + 代表出現1個以上
      $ 判斷到字串的最後面

$ perl 04.pl
請輸入帳號
_43243
不符合
# perl 04.pl
請輸入帳號
12abc
不符合
$ perl 04.pl
請輸入帳號
abc3134
符合
$ perl 04.pl
請輸入帳號
abc_13232
符合

理論上很完美,但是這裡面其實有一個很大的漏洞,有看出來嗎?第一個字元不接受數字和底線,其他符號反而能接受了,因此不能這樣寫,在寫正規表達式時,一定要多思考才不會漏洞百出。

修正

if( $line =~ /^[a-z][\da-z_]+$/ ){ print "符合\n"; }

有關於更多比對會再後面再介紹,下二篇先寫運算子...

上一篇 03-條件式判斷
回到目錄 01-撰寫第一隻PERL程式
下一篇 05-運算子 #1

你可能感興趣的文章

[PERL] 12- 副程式 Perl 的副程式就是所謂的函數

[PERL] 17-參照 PERL的參照,就是指標

[PERL] 06-運算子 #2 PERL的運算子介紹,總共有21種

PERL一次讀取檔案所有內容的方法($/) perl可以使用slurp mode一次讀完檔案所有內容的方法及一些範例

[PERL] 03-條件式判斷 perl的條件式判斷

自行撰寫syslog server建立資訊安全控管中心#4 -- 過濾條件設定 利用PERL將syslog收攏到資料庫的程式,過濾條件設定

[PERL] 11- 雜湊的範例 Perl 的幾個雜湊範例

[PERL] 13- 變數的視界 Perl 的副程式就是所謂的函數

[PERL] 19-模組的安裝和維護 模組的安裝和維護

[PERL] 使用CPAN安裝模組 在Linux 上,CPAN 可以用來安裝或管理 perl 的模組,此文教你怎麼做。

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

UTF-8的網頁但IE8一片空白 UTF8編碼的網頁在Firefox 正常顯示、但IE8 就是空白,IE8編碼設定是「自動偵測」可是自動偵測到的是 big5...

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

正則表達式:Email名稱防止連續輸入點(.)及下底線(_) Email的名稱中要允許特殊符號,但又不允許連續出現的正則表達式

問問題 問問題其實內涵很深,我悟了很久才懂。 有人問題的目的並不一定是想要得到答案,有時只是純粹想問問題..