天天看點

posix,perl正規表達式差別

1、正規表達式(Regular Expression,縮寫為regexp,regex或regxp),又稱正規表達式、正規表示式或正常表達式或正規化表示法或正規表示法,是指一個用來描述或者比對一系列符合某個句法規則的字元串的單個字元串 。在很多文本編輯器或其他工具裡,正規表達式通常被用來檢索和/或替換那些符合某個模式的文本内容 。許多程式設計語言都支援利用正規表達式進行字元串操作。例如,在Perl中就内建了一個功能強大的在正規表達式引擎。正規表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。

2、PHP同時使用兩套正規表達式規則,一套是由電氣和電子工程師協會(IEEE)制定的POSIX Extended 1003.2相容正則(事實上PHP對此标準的支援并不完善),另一套來自PCRE(Perl Compatible Regular Expression)庫提供PERL相容正則,這是個開放源代碼的軟體,作者為Philip Hazel。

使用POSIX相容規則的函數有:

ereg_replace()

ereg()

eregi()

eregi_replace()

split()

spliti()

sql_regcase()

mb_ereg_match()

mb_ereg_replace()

mb_ereg_search_getpos()

mb_ereg_search_getregs()

mb_ereg_search_init()

mb_ereg_search_pos()

mb_ereg_search_regs()

mb_ereg_search_setpos()

mb_ereg_search()

mb_ereg()

mb_eregi_replace()

mb_eregi()

mb_regex_encoding()

mb_regex_set_options()

mb_split()

使用PERL相容規則的函數有:

preg_grep()

preg_replace_callback()

preg_match_all()

preg_match()

preg_quote()

preg_split()

preg_replace()

3、定界符:

POSIX相容正則沒有定界符,函數的相應參數會被認為是正則。

PERL相容正則可以使用任何不是字母、數字或反斜線(\)的字元作為定界符,如果作為定界符的字元必須被用在表達式本身中,則需要用反斜線轉義。也可以使用(),{},[]和 <>作為定界符。

4、修正符:

POSIX相容正則沒有修正符。

PERL相容正則中可能使用的修正符(修正符中的空格和換行被忽略,其它字元會導緻錯誤):

i (PCRE_CASELESS):

比對時忽略大小寫。

m(PCRE_MULTILINE):

當設定了此修正符,行起始(^)和行結束($)除了比對整個字元串開頭和結束外,還分别比對其中的換行符(\n)的之後和之前。

s(PCRE_DOTALL):

如果設定了此修正符,模式中的圓點元字元(.)比對所有的字元,包括換行符。沒有此設定的話,則不包括換行符。

x(PCRE_EXTENDED):

如果設定了此修正符,模式中的空白字元除了被轉義的或在字元類中的以外完全被忽略。

e:

如果設定了此修正符,preg_replace()在替換字元串中對逆向引用作正常的替換,将其作為 PHP代碼求值,并用其結果來替換所搜尋的字元串。 隻有 preg_replace()使用此修正符,其它 PCRE函數将忽略之。

A(PCRE_ANCHORED):

如果設定了此修正符,模式被強制為“anchored”,即強制僅從目标字元串的開頭開始比對。

D(PCRE_DOLLAR_ENDONLY):

如果設定了此修正符,模式中的行結束($)僅比對目标字元串的結尾。沒有此選項時,如果最後一個字元是換行符的話,也會被比對在裡面。如果設定了m 修正符則忽略此選項。

S:

當一個模式将被使用若幹次時,為加速比對,值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字元的 non-anchored模式有用。

U(PCRE_UNGREEDY):

使“?”的預設比對成為貪婪狀态的。

X(PCRE_EXTRA):

模式中的任何反斜線後面跟上一個沒有特殊意義的字母導緻一個錯誤,進而保留此組合以備将來擴充。預設情況下,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。

u(PCRE_UTF8):

模式字元串被當成UTF-8。

5、邏輯區隔:

POSIX相容正則和PERL相容正則的邏輯區隔符号作用和使用方法完全一緻:

[]:包含任選一操作的相關資訊。

{}:包含比對次數的相關資訊。

():包含一個邏輯區間的相關資訊,可被用來進行引用操作。

|:表示“或”,[ab]和a|b是等價的。

元字元與“[]”相關:

有兩組不同的元字元:一種是模式中除了方括号内都能被識别的,還有一種是在方括号“[]”内被識别的。

POSIX相容正則和PERL相容正則“[]之外”“一緻”的元字元:

\ 有數種用途的通用轉義符

^ 比對字元串的開頭

$ 比對字元串的結尾

? 比對0或者1

* 比對 0個或多個前面指定類型的字元

+ 比對 1個或多個前面指定類型的字元

POSIX相容正則和PERL相容正則“[]之外”“不一緻”的元字元:

. PERL相容正則比對除了換行符外的任意一個字元

. POSIX相容正則比對任意一個字元

POSIX相容正則和PERL相容正則“[]之内”“一緻”的元字元:

^ 取反字元,但僅當其為第一個字元時有效

- 指定字元ASCII範圍,仔細研究ASCII碼,你會發現[W-c]等價于[WXYZ\\^_`abc]

POSIX相容正則和PERL相容正則“[]之内”“不一緻”的元字元:

- POSIX相容正則中[a-c-e]的指定會抛出錯誤。

- PERL相容正則中[a-c-e]的指定等價于[a-e]。

比對次數與“{}”相關:

POSIX相容正則和PERL相容正則在比對次數方面完全一緻:

{2}:表示比對前面的字元2次

{2,}:表示比對前面的字元2次或多次,預設都是貪婪(盡可能多)的比對

{2,4}:表示比對前面的字元2次或4次

邏輯區間與“()”相關:

使用()包含起來的區域是一個邏輯區間,邏輯區間的主要作用是展現出一些字元出現的邏輯次序,另一個用處就是可以用來引用(可以将此區間内的值引用給一個變量)。後一個作用比較奇特:

[php] 

view plain copy

  1. <?php  
  2. $str = "http://www.163.com/";  
  3. // POSIX相容正則:  
  4. echo ereg_replace("(.+)","<a href = \\1 >\\1</a>",$str);  
  5. // PERL相容正則:  
  6. echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);  
  7. // 顯示兩個連結  
  8. ?>  

在引用的時候,括号是可以嵌套的,邏輯次序是按照“(”出現的次序來标定的。

6、類型比對:

POSIX相容正則:

[:upper:]:比對所有的大寫字母

[:lower:]:比對所有的小寫字母

[:alpha:]:比對所有的字母

[:alnum:]:比對所有的字母和數字

[:digit:]:比對所有的數字

[:xdigit:]:比對所有的十六進制字元,等價于[0-9A-Fa-f]

[:punct:]:比對所有的标點符号,等價于[.,"'?!;:]

[:blank:]:比對空格和TAB,等價于[ \t]

[:space:]:比對所有的空白字元,等價于[ \t\n\r\f\v]

[:cntrl:]:比對所有ASCII 0到31之間的控制符。

[:graph:]:比對所有的可列印字元,等價于:[^ \t\n\r\f\v]

[:print:]:比對所有的可列印字元和空格,等價于:[^\t\n\r\f\v]

[.c.]:功能不明

[=c=]:功能不明

[:<:]:比對單詞的開始

[:>:]:比對單詞的結尾

7、PERL相容正則(這裡可以看出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 目标中的第一個比對位置

謀膽并重