Reglaur Expression 正規表達式介紹


Regular Expression 歷史
        最初出現於理論計算機科學的自動控制理論和形式化語言理論中。肯·湯普遜將此符號系統引入編輯器QED,然後是Unix上的編輯器ed,並最終引入grep。自此,正則表達式被廣泛地使用於各種Unix或者類似Unix的工具,例如Perl。

        POSIX是IEEE為要在各種UNIX作業系統上運行的軟體,Portable Operating System Interface(可移植作業系統介面)的縮寫,而定義API的一系列互相關聯的標準的總稱,其正式稱呼為IEEE 1003,而國際標準名稱為ISO/IEC 9945。Linux基本上逐步實現了POSIX兼容,微軟的Windows NT至少部分實現了POSIX兼容。

        目前 PHP 支持兩種正規表示式的實現:POSIX(IEEE 1003.2) 和 PCRE。 (兩者之間有些差異)   Perl正規表式源自於Henry Spencer寫的regex,它已經演化成了PCRE(Perl兼容正規表式,Perl Compatible Regular Expressions)。

正規式語法可分成兩種,
        ►基本型 BRE (basic RE)
            grep,sed,less,more,vi
        ►延伸型 ERE (extended RE)
            egrep,awk,sed,perl

正規式的建構分子有
    。一般字元
            除 ^$.*[, 等特定字元具有特殊意義外, 其餘之字元均為一般字元
    。字元集合
            以 [字元列表] 表示, 比對該位置字元須包含在字元列表內
            ● 範例
                [bp]ear 長度為四個字元, 以 b 或 p 為首,之後依序為 e, a 與 r
    。反相字元集合
            以 [^字元列表] 表示, 比對該位置字元不包含在字元列表內.
            ● 範例
                [bp]ear 長度為四個字元, 不可以 b 或 p 為首,之後依序為 e, a 與 r
    。POSIX 字元集
    • [:blank:]:空白字元(Blank characters),即 space 與 tab 字元。
    • [:space:]:廣義空白字元(Space characters),即 tab、 newline、 vertical tab、 form feed、 carriage return、與 space。
    • [:digit:]:數字(Digits),即「0 1 2 3 4 5 6 7 8 9」。
    • [:xdigit:]:十六進位數字(Hexadecimal digits),即「0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f」。
    • [:lower:]:所有小寫字母(Lower-case letters)。
    • [:upper:]:所有大寫字母(Upper-case letters)。
    • [:print:]:可列印字元(Printable characters),即 [:alnum:] 、 [:punct:] 與 空白(space)字元。
    • [:cntrl:]控制字元(Control characters)亦即所有八進位 ASCII 碼介於 000 至 037,再加上 177 (DEL 字元)。
    • [:punct:]:標點符號(Punctuation characters),即「! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~」。
    • [:graph:]:圖形字元(Graphical characters),即 [:alnum:] 與 [:punct:]
    • [:alpha:]:英文字母(Alphabetic characters),即 [:lower:] 與 [:upper:]
    • [:alnum:]:英文字母與數字,即 [:alpha:] 與 [:digit:]
    • [ : ascii : ]:十六進位字元。
    • [:word:] Perl extension ("[A-Za-z0-9_]"), 同 "\w".
               ● 範例
                    [abc[:alnum:]_]
    。任意字元
            以『.』表示,表示在該位置的一個字元,允許為任何字元
            ● 範例
                .ear 長度為四個字元, 第一個字元可為任何字元,之後依序為 e, a 與 r
    。定位字元
            『^』『$』分別代表行首與行尾.
            ● 範例
                ^.ear 符合.ear 且位於行首(第一個字元前即為行首).
                .ear$ 符合.ear 且位於行尾(r 後即為行尾).
    。字的邊界(word boundary)
            \b 長度為零, 該處為字的邊界
            \B 長度為零, 該處不為字的邊界
            ● 範例
                cat\b
                t 為該字之最後一個字元
                \bcat
                c 為該字之第一個字元
                \bcat\b 『cat』這個字
    。量詞
            正規式中出現連續相同的子 RE,可利用量詞(quantifier)來,
            『aaaaa』可簡寫為『a{5}』
                ► {5}代表重覆 5 次
                ► {5}與其前方長度為 1 之子 RE結合.

            用以限制符合次數的量詞:
                ►* 不限次數(零或多次)
                ►+ 至少一次
                ►? 零或一次
                ►{n}符合 n 次
                ►{n,}符合至少 n 次
                ►{n,m}符合至少 n, 至多 m 次

    。群組與擷取『(...)』
            正規式中, 括弧『(...)』的兩項功能
            為群組與擷取.
            ● 群組(Grouping)
               可用以將長度大於 1 之正規式與量詞結合,如『(ab){3}』相當於『ababab』
            ● 擷取(Capturing)
               若在 RE 中將某部分利用( 與 )標記起來, 則可在該 RE
               『\編號』來引用該部分所擷取到之字串,例如『([0-9][0-9])-\1』,表示擷取第一組()
    。修飾模式(Pattern Modifiers)
    • i (PCRE_CASELESS)
      不區分大小寫.
    • m (PCRE_MULTILINE)
      默認的, PCRE 認為目標字符串值是單行字符串 (即使他確實包含多行). 行開始標記 (^) 只匹配字符串的開始部分, 而行結束標記 ($) 只匹配字符串的尾部,或者一個結束行(除非指定 E 修飾符). 這個和 Perl 裡面一樣.
      如果設定了這個修飾符, 行開始和行結束結構分別匹配在目標字符串任何新行的當前位置後面的或者以前的, 和每一個開始和結束一樣. 這個等於 Perl 裡面的 /m 修飾符. 如果目標字符串沒有 "n" 字符, 或者模式裡沒有 ^ 或 $ ,這個修飾符不起作用.
    • s (PCRE_DOTALL)
      如果設置這個修飾符, 模式裡的一個"點"將匹配所有字符, 包括換行. 沒有他, 換行將被排除在外. 這個修飾符等同於 Perl 裡面的 /s 修飾符. 一個相反的類型,例如 [^a] 將總是匹配換行字符,而不管這個修飾符的限制.
    • x (PCRE_EXTENDED)
      如果設置這個修飾符, 模式裡面的空格數句將會被全部忽略,除非用轉義符或者一個字符的內部類型,還有所有字符類型外的未轉義的 # 號之間的也被忽略. 這個等同於 Perl 裡面的 /x 修飾符, 這樣可以複雜的模式裡面加入註釋. 注意,只適用於數據字符. 空格字符將不會在指定的模式字符指定順序中出現。
    • e
      如果設置這個修飾符, preg_replace() 將在替換值裡進行正常的涉及到 \ 的替換, 等同於在 PHP 代碼裡面一樣, 然後用於替換搜索到的字符串.
      只在 preg_replace() 裡使用這個修飾符; 其它 PCRE 函數忽略他.
    • A (PCRE_ANCHORED)
      如果設置這個修飾符, 模式被強制為錨(anchored), 也就是說, 他將值匹配搜索字符串的開始. 這個效果可以通過恰當的模式結構自身來實現,那是在 Perl 裡面的唯一途徑.
    • D (PCRE_DOLLAR_ENDONLY)
      如果設置這個修飾符,則模式裡的 $ 修飾符將僅匹配目標字符串裡的尾部. 沒有這個修飾符, $ 字符也匹配新行的尾部 (但是不再新行的前面). 如果設置了 m 修飾符則忽略這個修飾符. 在 Perl 裡面沒有類似的.
    • S
      如果一個模式將被使用多次, 使用長些時間分析他來來提高匹配的速度. 如果使用這個修飾符,則進行額外的分析. 目前, 研究模式僅用於非錨模式,沒有一個固定的開始字符.
    • U (PCRE_UNGREEDY)
      這個修飾符翻轉數量的 "greediness" ,使得默認不被 greedy,但是如果你緊跟問號(?),則可以 greedy. 這個和 Perl 不兼容. 這個也可以通過在模式裡面的(?U) 修飾符得到.
    • J (PCRE_INFO_JCHANGED)The (?J) internal option setting changes the local PCRE_DUPNAMES option. Allow duplicate names for subpatterns.
    • X (PCRE_EXTRA)
      這個修飾符打開額外的功能,這些和 Perl 不兼容. 任何模式裡面的後面帶字符但沒有特殊意義的反斜槓將引起錯誤, 從而儲備這些聯合用於將來的擴充. 默認的, 在 Perl 裡面, 反斜槓後面有無意義的字符被當成正常的 literal. 目前還沒有其他的控制特徵 
    。PERL兼容
    • \a alarm,即 BEL 字符('0)
    • \cx "control-x",其中 x 是任意字符
    • \e escape(』0B)
    • \f 換頁符 formfeed('0C)
    • \n 換行符 newline('0A)
    • \r 回車符 carriage return('0D)
    • \t 製表符 tab('0)
    • \xhh 十六進制代碼為 hh 的字符
    • \ddd 八進制代碼為 ddd 的字符,或 backreference
    • \d 任一十進制數字
    • \D 任一非十進制數的字符
    • \s 任一空白字符
    • \S 任一非空白字符
    • \w 任一「字」的字符
    • \W 任一「非字」的字符
    • \b 字分界線
    • \B 非字分界線
    • \A 目標的開頭(獨立於多行模式)
    • \Z 目標的結尾或位於結尾的換行符前(獨立於多行模式)
    • \z 目標的結尾(獨立於多行模式)
    • \G 目標中的第一個匹配位置
樣本群組
  • (?:pattern) --- 多個樣本的比對
  • (?=pattern) --- pattern 吻合前面才搜尋比對
  • (?!pattern) --- pattern 前面的就不比對
http://docstore.mik.ua/orelly/perl/perlnut/ch04_06.htm
POSIX 與 perl RE 的區別
http://purpen.iteye.com/blog/770751
貪婪?獲取?消耗?預查?
http://i420cc.blogspot.com/2011/03/blog-post_1029.html
常用正規表達式(站內)
http://wildsnote.blogspot.com/2012/03/blog-post.html
Regular Expression(正則表達式)入門修練 Ver3.50
http://www.ksana.tw/productivity/RegularExpressionTutorialVer350.pdf
Regex 101 tester
https://regex101.com/
 


常用pettern
  • 只抓 tr, td
    • <(?!\\/?(?:t[d])>).*?>
  •  

Live Tools
Reglaur Expression 正規表達式介紹 Reglaur Expression 正規表達式介紹 Reviewed by Wild on 3/02/2012 05:03:00 下午 Rating: 5

沒有留言:

沒有Google帳號也可發表意見唷!

技術提供:Blogger.