Perl 中的正则表达式
生活随笔
收集整理的這篇文章主要介紹了
Perl 中的正则表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
9????Perl?中的正則表達式正則表達式的三種形式?正則表達式中的常用模式?正則表達式的?8?大原則?正則表達式是?Perl?語言的一大特色,也是?Perl?程序中的一點難點,不過如果大家能夠很好的掌握他,就可以輕易地用正則表達式來完成字符串處理的任務,當然在?CGI?程序設計中就更能得心應手了。下面我們列出一些正則表達式書寫時的一些基本語法規則。--------------------------------------------------------------------------------9.1?正則表達式的三種形式首先我們應該知道?Perl?程序中,正則表達式有三種存在形式,他們分別是:匹配:m/<regexp>;/?(還可以簡寫為?/<regexp>;/?,略去?m)替換:s/<pattern>;/<replacement>;/轉化:tr/<pattern>;/<replacemnt>;/這三種形式一般都和?=~?或?!~?搭配使用(其中?"=~"?表示相匹配,在整條語句中讀作?does,"!~"?表示不匹配,在整條語句中讀作?doesn't),并在左側有待處理的標量變量。如果沒有該變量和?=~?!~?操作符,則默認為處理?$_?變量中的內容。舉例如下:$str?=?"I?love?Perl";$str?=~?m/Perl/;?#?表示如果在?$str?中發現?"Perl"?字符串,則返回?"1"?否則返回?"0"。$str?=~?s/Perl/BASH/;?#?表示將變量?$str?中的?"Perl"?字符串替換為?"BASH",如果發生此替換則返回?"1",否則返回?"0"。$str?!~?tr/A-Z/a-z/;?#?表示將變量?$str?中的所有大寫字母轉化為小寫字母,如果轉化發生了則返回?"0",否則返回?"1"。另外還有:foreach?(@array)?{?s/a/b/;?}?#?此處每次循環將從?@array?數組中取出一個元素存放在?$_?變量中,并對?$_?進行替換處理。while?(<FILE>;)?{?print?if?(m/error/);?}?#?這一句稍微復雜一些,他將打印?FILE?文件中所有包含?error?字符串的行。Perl?的正則表達式中如果出現?()?,則發生匹配或替換后?()?內的模式被?Perl?解釋器自動依次賦給系統?$1,?$2?......?請看下面的例子:$string?=?"I?love?perl";$string?=~?s/(love)/<$1>;/;?#?此時?$1?=?"love",并且該替換的結果是將?$string?變為?"I?<love>;?perl"$string?=?"i?love?perl";$string?=~?s/(i)(.*)(perl)/<$3>;$2<$1>;/;?#?這里?$1?=?"i",$2?=?"?love?",$3?=?"perl",并且替換后?$string?變為?"<perl>;?love?<i>;"替換操作?s/<pattern>;/<replacement>;/?還可以在末尾加上?e?或?g?參數,他們的含義分別為:s/<pattern>;/<replacement>;/g?表示把待處理字符串中所有符合?<pattern>;?的模式全部替換為?<replacement>;?字符串,而不是只替換第一個出現的模式。s/<pattern>;/<replacement>;/e?表示將把?<replacemnet>;?部分當作一個運算符,這個參數用的不多。比如下面的例子:$string?=?"i:love:perl";$string?=~?s/:/*/;?#此時?$string="i*love:perl";$string?=?"i:love:perl";$string?=~?s/:/*/g;?#此時?$string="i*love*perl";?$string?=~?tr/*/?/;?#此時?$string="i?love?perl";?$string?=?"www22cgi44";$string?=~?s/(\d+)/$1*2/e;?#?(/d+)代表?$string?中的一個或多個數字字符,將這些數字字符執行?*2?的操作,因此最后?$string?變成了?"www44cgi88"。下面給出一個完整的例子:#!/usr/bin/perlprint"請輸入一個字符串!\n";$string?=?<STDIN>;;?#?<STIDN>;代表標準輸入,會讓使用者輸入一字符串chop($string);?#?將$string最后一個換行的字符\n刪除掉if($string?=~?/perl/){print("輸入的字符串中有?perl?這個字符串!\n";}如果輸入的字符串含有?perl?這個字符串的話,就會顯示后面的提示信息。9.2?正則表達式中的常用模式下面是正則表達式中的一些常用模式。/pattern/??結果??.?匹配除換行符以外的所有字符?x??匹配?0?次或一次?x?字符串?x*?匹配?0?次或多次?x?字符串,但匹配可能的最少次數?x+?匹配?1?次或多次?x?字符串,但匹配可能的最少次數?.*?匹配?0?次或一次的任何字符?.+?匹配?1?次或多次的任何字符?{m}?匹配剛好是?m?個?的指定字符串?{m,n}?匹配在?m個?以上?n個?以下?的指定字符串?{m,}?匹配?m個?以上?的指定字符串?[]?匹配符合?[]?內的字符?[^]?匹配不符合?[]?內的字符?[0-9]?匹配所有數字字符?[a-z]?匹配所有小寫字母字符?[^0-9]?匹配所有非數字字符?[^a-z]?匹配所有非小寫字母字符?^?匹配字符開頭的字符?$?匹配字符結尾的字符?\d?匹配一個數字的字符,和?[0-9]?語法一樣?\d+?匹配多個數字字符串,和?[0-9]+?語法一樣?\D?非數字,其他同?\d?\D+?非數字,其他同?\d+?\w?英文字母或數字的字符串,和?[a-zA-Z0-9]?語法一樣?\w+?和?[a-zA-Z0-9]+?語法一樣?\W?非英文字母或數字的字符串,和?[^a-zA-Z0-9]?語法一樣?\W+?和?[^a-zA-Z0-9]+?語法一樣?\s?空格,和?[\n\t\r\f]?語法一樣?\s+?和?[\n\t\r\f]+?一樣?\S?非空格,和?[^\n\t\r\f]?語法一樣?\S+?和?[^\n\t\r\f]+?語法一樣?\b?匹配以英文字母,數字為邊界的字符串?\B?匹配不以英文字母,數值為邊界的字符串?a|b|c?匹配符合a字符?或是b字符?或是c字符?的字符串?abc?匹配含有?abc?的字符串?(pattern)?()?這個符號會記住所找尋到的字符串,是一個很實用的語法。第一個?()?內所找到的字符串變成?$1?這個變量或是?\1?變量,第二個?()?內所找到的字符串變成?$2?這個變量或是?\2?變量,以此類推下去。??/pattern/i?i?這個參數表示忽略英文大小寫,也就是在匹配字符串的時候,不考慮英文的大小寫問題。?\?如果要在?pattern?模式中找尋一個特殊字符,如?"*",則要在這個字符前加上?\?符號,這樣才會讓特殊字符失效?下面給出一些例子:????范例?說明?/perl/?找到含有?perl?的字符串?/^perl/?找到開頭是?perl?的字符串?/perl$/?找到結尾是?perl?的字符串?/c|g|i/?找到含有?c?或?g?或?i?的字符串?/cg{2,4}i/?找到?c?后面跟著?2個到?4個?g?,再跟著?i?的字符串?/cg{2,}i/?找到?c?后面跟著?2個以上?g?,再跟著?i?的字符串?/cg{2}i/?找到?c?后面跟著?2個?g,再跟著?i?的字符串?/cg*i/?找到?c?后面跟著?0個或多個?g?,再跟著?i?的字符串,如同/cg{0,1}i/?/cg+i/?找到?c?后面跟著一個以上?g,再跟著?i?的字符串,如同/cg{1,}i/?/cg?i/?找到?c?后面跟著?0個或是?1個?g?,再跟著?i?的字符串,如同/cg{0,1}i/?/c.i/?找到?c?后面跟著一個任意字符,再跟著?i?的字符串?/c..i/?找到?c?后面跟著二個任意字符,再跟著?i?的字符串?/[cgi]/?找到符合有這三個字符任意一個的字符串?/[^cgi]/?找到沒有這三個字符中任意一個的字符串?/\d/?找尋符合數字的字符,可以使用/\d+/來表示一個或是多個數字組成的字符串?/\D/?找尋符合不是數字的字符,可以使用/\D+/來表示一個或是更多個非數字組成的字符串?/\*/?找尋符合?*?這個字符,因為?*?在常規表達式中有它的特殊意思,所以要在這個特殊符號前加上?\?符號,這樣才會讓這個特殊字符失效?/abc/i?找尋符合?abc?的字符串而且不考慮這些字符串的大小寫?9.3?正則表達式的八大原則如果在?Unix?中曾經使用過?sed、awk、grep?這些命令的話,相信對于?Perl?語言中的正則表達式(Regular?Expression)不會感到陌生。Perl?語言由于有這個功能,所以對字符串的處理能力非常強。在Perl語言的程序中,經常可以看到正則表達式的運用,在?CGI?程序設計中也不例外。正則表達式是初學?Perl?的難點所在,不過只要一旦掌握其語法,你就可以擁有幾乎無限的模式匹配能力,而且?Perl?編程的大部分工作都是掌握常規表達式。下面給大家介紹幾條正則表達式使用過程中的?8?大原則。?正則表達式在對付數據的戰斗中可形成龐大的聯盟——這常常是一場戰爭。我們要記住下面八條原則:·?原則1:正則表達式有三種不同形式(匹配(m/?/),替換(s/?/?/eg)和轉換(tr/?/?/))。·?原則2:正則表達式僅對標量進行匹配(?$scalar?=~?m/a/;?可以工作;?@array?=~?m/a/?將把@array作為標量對待,因此可能不會成功)。·?原則3:正則表達式匹配一個給定模式的最早的可能匹配。缺省時,僅匹配或替換正則表達式一次(?$a?=?'string?string2';?$a?=~?s/string/?/;?導致?$a?=?'string?2')。·?原則4:正則表達式能夠處理雙引號所能處理的任意和全部字符(?$a?=~?m/$varb/?在匹配前把varb擴展為變量;如果?$varb?=?'a'?$a?=?'as',$a?=~?s/$varb/?/;?等價于?$a?=~?s/a/?/;?,執行結果使?$a?=?"?s"?)。·?原則5:正則表達式在求值過程中產生兩種情況:結果狀態和反向引用:?$a=~?m/pattern/?表示?$a?中是否有子串?pattern?出現,$a?=~?s/(word1)(word2)/$2$1/?則“調換”這兩個單詞。·?原則6:正則表達式的核心能力在于通配符和多重匹配運算符以及它們如何操作。$a?=~?m/\w+/?匹配一個或多個單詞字符;$a?=~?m/\d/"?匹配零個或多個數字。·?原則7:如果欲匹配不止一個字符集合,Perl使用?"|"?來增加靈活性。如果輸入?m/(cat|dog)/?則相當于“匹配字符串?cat?或者?dog。·?原則8:Perl用?(?..)?語法給正則表達式提供擴展功能。(這一點請同學們課后看相關資料)想要學習所有這些原則?我建議大家先從簡單的開始,并且不斷的嘗試和實驗。實際上如果學會了?$a?=~?m/ERROR/?是在?$a?中查找子串ERROR,那么你就已經比在?C?這樣的低層語言中得到了更大的處理能力。
?
轉載于:https://www.cnblogs.com/lashwang/p/3719349.html
總結
以上是生活随笔為你收集整理的Perl 中的正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信浏览器 返回按钮二次返回
- 下一篇: 自定义控件之-----progressB