jojo's blog--快樂憂傷都與你同在
          為夢想而來,為自由而生。 性情若水,風(fēng)起水興,風(fēng)息水止,故時(shí)而激蕩,時(shí)又清平……
          posts - 11,  comments - 30,  trackbacks - 0
          定義:正則表達(dá)式是一種字符串模式,可用來和字符串進(jìn)行匹配。匹配可能成功,也可能失敗。許多UNIX命令,包括grep, sed, awk, ed, vi, emacs都有正則表達(dá)式的功能。Perl也有這種功能。Python也具有這種功能。
          簡單示例
          例如:
          grep abd readme.file > result.txt
          則Perl中,寫成
          if(/abc/)
          {
           print $_;
          }
          在Perl中,正則表達(dá)式用斜線標(biāo)記,以代表斜線之間的內(nèi)容是個(gè)正則表達(dá)式。當(dāng)表達(dá)式北斜線包圍時(shí),Perl會(huì)拿$_和它作比較,以判斷條件的真假。
             while(<>) {
          if (/abc/) {
              print $_;
          }
          }
          這個(gè)程序片斷能讀入某文件的所有內(nèi)容,并進(jìn)行匹配。
           grep “ab*c” readme.file > result
           while( <> )
           {
              if (/ab*c/) {
                 print $_;
          }
             }
            以上程序片斷表示以a開頭,后面跟0個(gè)以上的b,最后以c結(jié)尾。
           替代運(yùn)算符以s字母開頭,跟正則表達(dá)式,再跟替代的運(yùn)算符號(hào)。
             s/ab*c/def/
            變量是$_會(huì)跟正則表達(dá)式(ab*c)做比較。進(jìn)行匹配。
           類型:一個(gè)“正則表達(dá)式”就是一種類型pattern。分為單字符類型和多字符類型。
          單字符類型:單字符類型是最常見和最常用的類型。如a。單字符類型”.”能跟除換行符號(hào)(\n)的任何字符匹配。如
          /a./
           會(huì)和任何長度為二,且開頭是a的字符串匹配。除了”a\n”外。
           字符類:(character class),寫法是左右兩個(gè)中括號(hào)([]),內(nèi)放字符。即字符串對應(yīng)此類型的地方,若出現(xiàn)唯一一個(gè)符合括號(hào)中列出的字符,就算符合。
           /[abcde]/
           /[aeiouAEIOU]/
          若在中括號(hào)中放[或者],則需要在前面加反斜杠。如果想表示一段范圍,則可以用破折號(hào)(dash-)連接。想表示破折號(hào),則前面也必須加反斜杠。
          [0123456789]
          [0-9]
          [0-9\-]
          [a-zA-Z]
          也可以用“反例”表示字符類別,只要在原來的寫法前加上“^”即可。此種類型的意思是任何不在此類別內(nèi)的單一字符才算上匹配。
          [^0-9]
          [^aeiouAEIOU]
          [^\^]
          預(yù)定義的字符類別
          字符
          類別
          反例
          反例類別
          \d
          [0-9]
          \D
          [^0-9]
          \w
          [a-zA-Z]
          \W
          [^a-zA-Z]
          \s
          [\r\t\n\f]
          \S
          [^\r\t\n\f]
          [\da-fA-F] #十六進(jìn)制數(shù)字
          類型組合:grouping pattern就是將正則表達(dá)式組合起來用。
          系列:sequence, 如”abc”
          重復(fù)符號(hào):multiplier,如星號(hào)(*)表示出現(xiàn)零次以上;加號(hào)(+)則表示出現(xiàn)一次以上;問號(hào)(?)則表示出現(xiàn)零次或一次。
               /fo+ba?r/
          以上的類型都是貪婪型的greedy。
          $_ = “fred xxxxxxxxx barney”;
          s/x+/boom/
          一般重復(fù)符號(hào):(general multiplier),寫法是一對大括號(hào)中放一個(gè)或兩個(gè)數(shù)字,如/x{5, 10}/,表示x出現(xiàn)5到10次;/x{5,}/表示出現(xiàn)5次以上;/x{5}/表示剛好5個(gè)x;/x{0,5}/意思就是”0到5個(gè)”
          正則表達(dá)式如出現(xiàn)兩個(gè)重復(fù)符號(hào),必須遵循“最左邊最貪心”(leftmost is greediest)的規(guī)則。
          $_ = “a xxx c xxxxxxxxxx c xxx d”;
          /a.*c.*d/;
          以這個(gè)例子,第一個(gè)“.”就會(huì)和第二個(gè)c之前所有的字符符合。可以在重復(fù)符號(hào)后面加上問號(hào),讓它變得“不貪心”(nongreedy)。
          $_=”a xxx c xxxxxx c xxx d”;
          /a.*c?.*d/
          把字符串和正則表達(dá)式再該一下:
          $_=”a xxx ce xxxxxxx ci xxx d”;
          /a.*ce.*d/
          這個(gè)例子中.*如果匹配到第二個(gè)c,則e沒有辦法匹配。故Perl會(huì)重試,降低了效率。實(shí)際上只要加個(gè)”?”就能讓Perl少做很多事。
          把括號(hào)當(dāng)記憶空間:另外一個(gè)組合符號(hào),是前后包圍任何類型的括號(hào)對(parentheses pair)。括號(hào)不會(huì)改變類型匹配的情形,不過可以把匹配的部分記錄下來,以后參考。調(diào)用記住部分,寫法是在反斜線后面加上數(shù)字。
             /fred(.)barney\1/;
            會(huì)和fredxbarneyx匹配,不會(huì)和fredxbarneyy匹配。但是/fred.barney./和兩個(gè)字符串都匹配。
          其中\(zhòng)1代表正則表達(dá)式中,第一個(gè)用括號(hào)括起來的部分。依次有\(zhòng)2, \3…
          /a(.)b(.)c\2d\1/;
          可以在括號(hào)中放入一個(gè)以上的字符。如/a(.*)b\1c/;
          選項(xiàng)符號(hào):還有一種組合符號(hào)稱為選項(xiàng)符號(hào)(alternation),如“a|b|c”。選項(xiàng)可以不只一個(gè)字符,如/song|blue/。
          定位類型:anchor pattern定位類型有好幾種。定位類型\,表示目標(biāo)字符串的這個(gè)地方必須是文字邊界(word boundary)。所謂“文字邊界”就是指符合\w或\W的字符,二個(gè)中間的位置;或者界于任何符合\w的字符,與字符串開頭(或結(jié)尾)中間的位置。
          /fred\b/      #會(huì)和fred匹配,不會(huì)和Frederick匹配
          /\bmo/      #會(huì)和moemole匹配,不會(huì)和Elmo匹配
          /\bFred\b/   #會(huì)和Fred匹配,但FrederickalFred都不匹配
          /\b\+\b/     #會(huì)和x+y匹配,不會(huì)和+++匹配
          另一個(gè)定位類型\B所在之處就不一定是文字邊界,如
          /\bFred\B/   #會(huì)和Frederich匹配,但Fred Flintstone不匹配
          還有兩種類型,代表字符串的開頭或結(jié)尾的前一個(gè)字符。“^”會(huì)和字符串的“開頭”匹配。^a會(huì)匹配以a開頭的字符串,不過a^會(huì)和”a”和” ^”這兩個(gè)字符串匹配。即”^”失去了特別的意義 。如果想表示字符串開頭是有個(gè)^號(hào),則用\^即可。另外一個(gè)定位類型是”$”,不過表示字符串結(jié)尾。c$表示最后出現(xiàn)的字符是c的那個(gè)字符串。表示$這個(gè) 字符,用\$表示。
          優(yōu)先級(jí)
          名稱
          表示法
          括號(hào)(parentheses)
          () (?:)
          重復(fù)運(yùn)算符(multiplier)
          ? + * {m, n} ?? +? *? {m, n}?
          序列和定位符號(hào)(sequence and anchoring)
          abc^$\A\Z(?=) (?!)
          選項(xiàng)符號(hào)(alternation)
          |
           abc*           #會(huì)和ab, abc, abcc, abccc, abcccc匹配
           (abc)*
           ^x|y
           ^(x|y)
           a|bc|d
           (a|b)(c|d)
           (song|blue)bird
          =~運(yùn)算符:如果拿來匹配的字符串,不放在$_變量,則可以用”=~”運(yùn)算符來解決:可把正則表達(dá)式放在運(yùn)算符右側(cè),左側(cè)則是想比較的字符串。即把正則表達(dá)式的默認(rèn)目標(biāo)轉(zhuǎn)向運(yùn)算符的左邊運(yùn)算單元。
          $a = “hello world!”;
          $a =~ /^he/;
          $a=~/(.)\1/;
          if($a=~/(,)\1/)
          任何能傳回標(biāo)量字符串值的語句,都可以當(dāng)作=~運(yùn)算符的左邊單元。如,如
          print “any last request?”;
          if( =~ /^[yY]/) {
          print “And just what might that request be”;
          print “Sorry, I’m unable to do that.\n”
          }
          忽略大小寫:grep有-I這個(gè)旗標(biāo),意思是忽略大小寫;在Perl中提供了類似的方法:在正則表達(dá)式第二個(gè)斜線之后寫上I即可。如/somepattern/i。
             print “any last request?”;
             if ( =~ /^y/i)
             {
             }
          指定界限符號(hào):正則表達(dá)式前后用斜線包起來,斜線叫分界符號(hào)(delimiter),如果想在正則表達(dá)式表示斜線這個(gè)“字符”,在前面加反斜線。
           $path =
           if($path =~ /^\/usr\/etc/) {
          }
          Perl允許設(shè)計(jì)者自行指定分界符合。可用任何-個(gè)非字母、非數(shù)字、非空白的字符為分界符號(hào),方法是在第一次使用之前寫”m”。
           /^\/usr\/etc/
           m@^/user/etc@
           m#^/usr/etc#
           內(nèi)插變量:正則表達(dá)式也可以內(nèi)插變量。
           $what = “bird”
           $sentence = “Every good bird does fly.”;
           if($sentence =~ /\b$what\b/)
           {
          print “The sentence contains the word $what\n”;
           }
           下面的例子稍微復(fù)雜一些:
           $sentence = “Every good bird does fly.”;
           print “What should I look for?”;
           $what = ;
           chomp($what);
           if($sentence =~ /$what/)
           {
          print “I saw $what in $sentence.\n”;
           }
           else
           {
          print “nope… didn’t find it.\n”;
           }
          特別的只讀變量:匹配成功后,名為$1, $2, $3…的這些變量,它們的值被分別設(shè)為\1,\2,\3…之值。
             $_ = “this is a test”;
             /(\w+)W+(\w+)/#和頭兩個(gè)文字匹配;現(xiàn)在$1”this”$2”is”
          也可以在列表環(huán)境下,一次取得所有匹配的片斷。
             $_=”this is a test.”;
           ($first, $second) = /(\w+)W+(\w+)/;
          其他預(yù)定義的只讀變量包括:”$&”,代表字符串中匹配正則表達(dá)式的部分;”$`”代表匹配處之前的部分;”$’”代表匹配處之后的部分。
           $_=”this is a sample string.”;
           /sa.*le/;   #和sample匹配。s`是”this is a “,$&是”sample”,$’是”string”
          替代運(yùn)算符:s/old-regex/new-string/這樣的用法是最簡單的一種替代運(yùn)算符。如果想讓替代運(yùn)算符在每個(gè)匹配的地方取代,而非僅作用在第一個(gè)匹配處,在運(yùn)算符加g.
           $_=”foot fool buffoon”;
           s/foo/bar/g;
          替代運(yùn)算符也可以內(nèi)插變量,像這樣:
           $_=”hello, world”;
           $new = “goodbye”;
           s/hello/$new/;
          可以在替代運(yùn)算符里用字符類型,就不會(huì)和固定的字符匹配了:
           $_=”this is a test”;
           s/(\w+) /<$1>/g; #$_現(xiàn)在是  

            

          替代運(yùn)算符可以加上i,代表忽略大小寫,如果已經(jīng)有g(shù)了,則i可以出現(xiàn)在g前后。斜線還可以用其他符號(hào)代替。s#fred#barney#;替代運(yùn)算符也可以用=~改變作用的目標(biāo)。
          split和join函數(shù):正則表達(dá)式可以把字符串分成許多字段。split函數(shù)可以這樣做。而join函數(shù)則可以把這些片斷組合起來。 split函數(shù)有兩個(gè)參數(shù),分別是正則表達(dá)式和字符串,它會(huì)尋找字符串中匹配正則表達(dá)式的部分,其他不匹配的部分會(huì)依序用列表值方式傳回。
          $line= “merlyn::118:10:Randal:/home/merlyn:/urs/bin/perl “;
          @fields = split(/:/, $line);
          如果要匹配一個(gè)以上的:則用:
          @fields = split(/:+, $line);
          變量$_是split函數(shù)的第二個(gè)參數(shù)的默認(rèn)值:
          $_=”some string”;
          @words =split(/ /);
          由于參數(shù)字符串內(nèi)沒有連續(xù)的空白字符,結(jié)果會(huì)是空字符串。理想的寫法是/ +/, /\s+/和”一個(gè)以上“的空白字符匹配。這是第一個(gè)參數(shù)的默認(rèn)值。
          @words = split;用空白字符分割$_
          $line=”merlyn::118:10:Randa;:/home/merlyn:”);
          ($name,$password,$uid,$gid,$gcos,$home,$shell)=split(/:/,$line);
          join函數(shù)跟split函數(shù)對應(yīng),該函數(shù)用第一個(gè)參數(shù)字符串當(dāng)作”膠”,把第二個(gè)參數(shù)里面的值一個(gè)個(gè)“粘“起來。
          $bigstring=join($glue,@list);
          posted on 2009-02-03 15:19 Blog of JoJo 閱讀(1024) 評(píng)論(0)  編輯  收藏 所屬分類: Linux 技術(shù)相關(guān)

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          相冊

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 宁明县| 三江| 安塞县| 射洪县| 苍溪县| 福州市| 聂拉木县| 武汉市| 玉门市| 苏尼特左旗| 苗栗市| 隆尧县| 荔浦县| 巍山| 邯郸县| 高雄县| 兴化市| 张家界市| 巴南区| 武隆县| 武鸣县| 佛山市| 芜湖市| 绥芬河市| 广灵县| 澳门| 罗甸县| 普洱| 陇川县| 佛山市| 普兰店市| 宜君县| 阿拉善左旗| 新和县| 博乐市| 五原县| 田林县| 荣昌县| 托里县| 花莲县| 临泽县|