<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

      

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

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章分類

    文章檔案

    新聞分類

    新聞檔案

    相冊

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品无码成人片在线观看| 黄页网站免费观看| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲欧美自偷自拍另类视| 成年女人午夜毛片免费看| 亚洲av日韩av无码av| 成熟女人牲交片免费观看视频| 亚洲中文字幕乱码AV波多JI| 在线免费视频一区二区| 亚洲欧美日韩国产精品一区| 日韩精品免费电影| 男性gay黄免费网站| 亚洲Av无码乱码在线znlu| 国产日韩久久免费影院| 亚洲av色福利天堂| 成年人视频免费在线观看| 亚洲日韩精品无码专区加勒比 | 久久精品国产亚洲AV无码娇色| 99久久精品免费精品国产| 亚洲人成伊人成综合网久久| 女人毛片a级大学毛片免费| 鲁啊鲁在线视频免费播放| 中文字幕一精品亚洲无线一区| 光棍天堂免费手机观看在线观看| 亚洲综合无码一区二区| 动漫黄网站免费永久在线观看| 午夜在线亚洲男人午在线| 亚洲伊人久久综合中文成人网| 久久国产精品免费看| 亚洲一区二区三区在线| 免费又黄又爽的视频| 午夜无码A级毛片免费视频| 亚洲av极品无码专区在线观看| 午夜亚洲国产成人不卡在线| 国产精品区免费视频| 亚洲无mate20pro麻豆| 亚洲中文字幕成人在线| 黄页网站免费观看| 三上悠亚电影全集免费| 亚洲一本到无码av中文字幕| 亚洲人成色77777|