Regex (39)

來源:互聯網
上載者:User
Regex簡介:

??Regex是用於描述字元排列和匹配模式的一種文法規則。它主要用於字串的模式分割、匹配、尋找及替換操作。到目前為止,我們前面所用過的精確(文本)匹配也是一種Regex。
??在PHP中,Regex一般是由正規字元和一些特殊字元(類似於萬用字元)聯合構成的一個文字模式的程式性描述。

??PHP中,Regex有三個作用:

??匹配,也常常用於從字串中析取資訊。
??用新文本代替匹配文本。
??將一個字串拆分為一組更小的資訊塊。
??一個Regex中至少包含一個原子

在PHP中有兩套Regex函數庫,兩者功能相似,只是執行效率略有差異:

??一套是由PCRE(Perl Compatible Regular Expression)庫提供的。使用“preg_”為首碼命名的函數;
??一套由POSIX(Portable Operating System Interface of Unix)擴充提供的。使用以“ereg_”為首碼命名的函數;
??使用Regex的原因之一,是在典型的搜尋和替換操作中,只能對確切文字進行匹配,對象動態文本的搜尋就有困難了,甚至是不可能的。

Regex的文法規則

PCRERegex:
??PCRE全稱為Perl Compatible Regular Expression,意思是Perl相容Regex。
??PCRE來源於Perl語言,而Perl是對字串操作功能最強大的語言之一,PHP的最初版本就是由Perl開發的產品。
??PCRE文法支援更多特性,比POSIX文法更強大,實現相同的功能函數,使用PCRE庫的效率略佔優勢。但是它們也有很多相同點。
??在PCRE中,通常將模式運算式(即Regex)包含在兩個反斜線“/”之間,如“/apple/”。使用者只要把需要匹配的模式內容放入定界符之間即可。作為定界的字元也不僅僅局限於“/”。除了字母、數字和斜線“\”以外的任何字元都可以作為定界符,像“#”、“|”、“!”等都可以的。

原子(Atom)

原子是組成Regex的基本單位,在分析Regex時,應作為一個整體。
??原子字元包括所有的英文字母、數字、標點符號以及其他一些符號。原子也包括以下內容。
??單個字元、數字,如a-z,A-Z,0-9。
??模式單元,如(ABC)可以理解為由多個原子組成的大的原子。
??原子表,如[ABC]。
??重新使用的模式單元,如:\\1
??普通逸出字元,如:\d,\D,\w
??轉義元字元,如:\*,\.

普通逸出字元

原子說明
-----------------------------------------------------------------
\d  匹配一個數字;等價於[0-9]
\D  匹配除數字以外任何一個字元;等價於[^0-9]
\w  匹配一個英文字母、數字或底線;等價於[0-9a-zA-Z_]
\W  匹配除英文字母、數字和底線以外任何一個字元;等價於[^0-9a-zA-Z_]
\s  匹配一個空白字元;等價於[\f\n\r\t\v]
\S  匹配除空白字元以外任何一個字元;等價於[^\f\n\r\t\v]
\f  匹配一個換頁符等價於\x0c 或\cL
\n  匹配一個分行符號;等價於\x0a 或\cJ
\r  匹配一個斷行符號符等價於\x0d 或\cM
\t  匹配一個定位字元;等價於\x09\或\cl
\v  匹配一個垂直定位字元;等價於\x0b或\ck
\oNN  匹配一個八位元字
\xNN  匹配一個十六進位數字
\cC  匹配一個控制字元

元字元(Meta-character)

元字元是用於構造規則運算式的具有特殊含義的字元。如果要在Regex中包含元字元本身,必須在其前加上”\”進行轉義
元字元說明
-----------------------------------------------------------------
*   0次、1次或多次匹配其前的原子
+   1次或多次匹配其前的原子
?  0次或1次匹配其前的原子
|  匹配兩個或多個選擇
^   或\A匹配字串串首的原子
$   或\Z 匹配字串串尾的原子
\b  匹配單詞的邊界
\B  匹配除單詞邊界以外的部分
[]  匹配方括弧中的任一原子
[^]  匹配除方括弧中的原子外的任何字元
{m}  表示其前原子恰好出現m次
{m,n}  表示其前原子至少出現m次,至少出現n次(n>m)
{m,}  表示其前原子出現不少於m次
()  整體表示一個原子
.  匹配除換行之外的任何一個字元

字串邊界限制

在某些情況下,需要對匹配範圍進行限定,以獲得更準確的匹配結果。“^”和“$”分別指定字串的開始和結束。
??例如,在字串“Tom and Jerry chased each other in the house until tom’s uncelcome in”中
??元字元“^”或“\A”置於字串的開始確保模式比對出現在字串首端;
/^Tom/
??元字元“$”或“\Z”置於字串的結束,確保模式比對出現字串尾端。
/in$/
??如果不加邊界限制元字元,將獲得更多的匹配結果。
/^Tom$/精確匹配  /Tom/模糊比對

單詞邊界限制

在使用各種編輯軟體的尋找功能時,可以通過選擇“按單詞尋找”獲得更準確的結果。Regex中也提供類似的功能。
??例如:在字串“This island is a beautiful land”中
??元字元“\b”對單詞的邊界進行匹配;
/\bis\b/ 匹配單詞“is”,不匹配“This”和“island”。
/\bis/匹配單詞“is”和“island”中的“is”,不匹配“This”
??元字元“\B”對除單詞邊界以外的部分進行匹配。
/\Bis\B/ 將明確的指示不與單詞的左、右邊界匹配,只匹配單詞的內部。所以在這個例子中沒有結果。
/\Bis/匹配單詞“This”中的“is”

重複匹配

Regex中有一些用於重複匹配某些原子的元字元:“?”、“*”、“+”。他們主要的區別是重複匹配的次數不同。
??元字元“?”:表示0次或1次匹配緊接在其前的原子。
例如:/colou?r/匹配“colour”或“color”。
??元字元“*”:表示0次、1次或多次匹配緊接在其前的原子。
例如:/zo*/可以匹配z、zoo
??元字元“+”:表示1次或多次匹配緊接在其前的原子。
例如:/go+gle/匹配“gogle”、“google”或“gooogle”等中間含有多個o的字串。

任何一個字元

元字元“.”匹配除分行符號外任何一個字元。
??相當於:[^\n](Unix系統)或[^\r\n](windows系統)。
??例如:/pr.y/可以匹配的字串“prey”、“pray”或“pr%y”等。
??通常可以使用“.*”組合來匹配除分行符號外的任何字元。在一些書籍中也稱其為“全匹配符”或“單含匹配符”。
??例如:
??/^a.*z$/表示可以匹配字母“a”開頭,字母“z”結束的任意不包括分行符號的字串。
??/.+/也可以完成類似的匹配功能所不同的是其至少匹配一個字元。
??/^a.+z$/匹配“a%z”不匹配字串“az”

原子表-方括號運算式

原子表”[]”中存放一組原子,彼此地位平等,且僅匹配其中的一個原子。如果想匹配一個”a”或”e”使用[ae]。
??例如: Pr[ae]y匹配”Pray”或者”Prey ”。
??原子表”[^]”或者稱為排除原子表,匹配除表內原子外的任意一個字元。
??例如:/p[^u]/匹配“part”中的“pa”,但無法匹配“computer”中的“pu”因為“u”在匹配中被排除。
??原子表“[-]”用於串連一組按ASCII碼順序排列的原子,簡化書寫。
??例如:/x[0123456789]/可以寫成x[0-9],用來匹配一個由“x”字母與一個數字組成的字串。
??例如:
??/[a-zA-Z]/匹配所有大小寫字母
??/^[a-z][0-9]$/匹配比如“z2”、“t6”、“g7”
??/0[xX][0-9a-fA-F]/匹配一個簡單的十六進位數字,如“0x9”。
??/[^0-9a-zA-Z_]/匹配除英文字母、數字和底線以外任何一個字元,其等價於\W。
??/0?[ xX][0-9a-fA-F]+/匹配十六進位數字,可以匹配“0x9B3C”或者“X800”等。
??/<[A-Za-z][A-Za-z0-9]*>/可以匹配“

”、“”或“”等HTML標籤,並且不嚴格的控制大小寫。

模式選擇符

元字元“|”又稱模式選擇符。在Regex中匹配兩個或更多的選擇之一。
??例如:
??在字串“There are many apples and pears.”中,/apple|pear/在第一次運行時匹配“apple”;再次運行時匹配“pear”。也可以繼續增加選項,如:/apple|pear|banana|lemon/

模式單元

元字元“()”將其中的Regex變為原子(或稱模式單元)使用。與數學運算式中的括弧類似,“()”可以做一個單元被單獨使用。
??例如:
??/(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”,因為緊接著“+”前的原子是元字元“()”括起來的字串“Dog”。
??/You (very )+ old/匹配“You very old”、“You very veryold”
??/Hello (world|earth)/匹配“Hello world”、“Hello earth”
??一個模式單元中的運算式將被優先匹配或運算。

重新使用的模式單元

系統自動將模式單元“()”中的匹配依次儲存起來,在需要時可以用“\1”、“\2”、“\3”的形式進行引用。當Regex包含有相同的模式單元時,這種方法非常便於對其進行管理。注意使用時需要寫成“\\1”、“\\2”
例如:
??/^\d{2}([\W])\d{2}\\1\d{4}$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字串。但上述Regex不匹配“12/34-5678”的格式。這是因為模式“[\W]”的結果“/”已經被儲存。下個位置“\1”引用時,其匹配模式也是字元“/”。
??當不需要儲存匹配結果時使用非儲存模式單元“(?:)”
??例如/(?:a|b|c)(D|E|F)\\1g/ 將匹配“aEEg”。在一些Regex中,使用非儲存模式單元是必要的。否則,需要改變其後引用的順序。上例還可以寫成/(a|b|c)(C|E|F)\\2g/。


以上就介紹了Regex (39),包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.