POSIX,Perl正規表示式區別

2022-07-30 23:15:23 字數 4424 閱讀 2464

正規表示式(regular expression,縮寫為regexp,regex或regxp),又稱正規表示式、正規表示式或常規表示式或正規化表示法或正規表示法,是指乙個用來描述或者匹配一系列符合某個句法規則的字串的單個字串 。在很多文字編輯器或其他工具裡,正規表示式通常被用來檢索和/或替換那些符合某個模式的文字內容 。許多程式語言都支援利用正規表示式進行字串操作。例如,在perl中就內建了乙個功能強大的在正規表示式引擎。正規表示式這個概念最初是由 unix中的工具軟體(例如sed和grep)普及開的。(摘自維基百科)

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()

定界符:

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

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

修正符:

posix相容正則沒有修正符。

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

i (pcre_caseless):

匹配時忽略大小寫。

m(pcre_multiline):

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

s(pcre_dotall):

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

x(pcre_extended):

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

e:a(pcre_anchored):

如果設定了此修正符,模式被強制為「anchored」,即強制僅從目標字串的開頭開始匹配。

d(pcre_dollar_endonly):

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

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

u(pcre_ungreedy):

使「?」的預設匹配成為貪婪狀態的。

x(pcre_extra):

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

u(pcre_utf8):

模式字串被當成utf-8。

邏輯區隔:

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次或4次

邏輯區間與「()」相關:

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

<?php

$str = "";

// posix相容正則:

echo ereg_replace("(.+)","\1",$str);

// perl相容正則:

echo preg_replace("/(.+)/","$1",$str);

// 顯示兩個鏈結

?>

在引用的時候,括號是可以巢狀的,邏輯次序是按照「(」出現的次序來標定的。

型別匹配:

posix相容正則:

[:upper:]:匹配所有的大寫字母

[:lower:]:匹配所有的小寫字母

[:alpha:]:匹配所有的字母

[:alnum:]:匹配所有的字母和數字

[:digit:]:匹配所有的數字

[:xdigit:]:匹配所有的十六進製制字元,等價於[0-9a-fa-f]

[:punct:]:匹配所有的標點符號,等價於 [.,"'?!;:]

[:blank:]:匹配空格和tab,等價於[ t]

[:space:]:匹配所有的空白字元,等價於[ tnrfv]

[:cntrl:]:匹配所有ascii 0到31之間的控制符。

[:graph:]:匹配所有的可列印字元,等價於:[^ tnrfv]

[:print:]:匹配所有的可列印字元和空格,等價於:[^tnrfv]

[.c.]:功能不明

[=c=]:功能不明

[:<:]:匹配單詞的開始

[:>:]:匹配單詞的結尾

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 目標中的第乙個匹配位置

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...