首頁  >  文章  >  後端開發  >  正規表示式 (39)

正規表示式 (39)

WBOY
WBOY原創
2016-08-08 09:23:23832瀏覽

正規表示式簡介:

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

??PHP中,正規表示式有三個作用:

??匹配,也常用於從字串中析取訊息。
??用新文本代替匹配文本。
??將一個字串拆分為一組較小的資訊區塊。
??一個正規表示式中至少包含一個原子

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

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

正規表示式的語法規則

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

原子(Atom)

原子是組成正規表示式的基本單位,在分析正則表達式時,應作為一個整體。
??原子字元包括所有的英文字母、數字、標點符號以及其他一些符號。原子也包括以下。
??單字、數字,如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  匹配一個空白字元;等價於[fnrtv]
S  匹配除空白字元以外任何一個字元;價於[^fnrtv]
f  匹配一個換頁符等價於x0c 或cL
n  匹配一個換行符;等價於x0a 或cJ
n  匹配一個換行符;等價於x0a 或cJ cM
t  匹配一個製表符;等價於x09或cl
v  匹配一個垂直製表符;等價於x0b或ck
制數字進位數字
cC  匹配一個控製字元
元字元(Meta-character)

元字元是用來建構規則表達式的具有特殊意義的字元。如果要在正規表示式中包含元字元本身,必須在其前加上””進行轉義
元字元說明
------------------ ----------------------------------------------
*   0次、1次或多次配對其前的原子
+   1次或多次配對其前的原子
?  0次或1次符合其前的原子與兩個匹配
?  0次或1次符合其前的原子與兩個匹配多重選擇
^   或A匹配字串串首的原子
$   或Z 匹配字串串尾的原子
b〜〜b〜〜的邊界串尾的原子㟎b〜〜
[]  匹配方括號中的任一原子
[^]  匹配除方括號中的原子外的任何字符
{m}  表示其前原子外的任何字符
{m}  <表示其前原子至少出現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/模糊匹配

單字邊界限制

在使用各種編輯軟體的查找功能時,可以透過選擇「按單字查找」來獲得更準確的結果。正規表示式中也提供類似的功能。

??例如:在字符串“This island is a beautiful land”中
??元字符“b”對單詞的邊界進行匹配;
/bisb/ 匹配單詞“is”,不匹配單詞“is”,不匹配單詞“is”,不匹配單詞“is”,不匹配單詞“is”,不匹配單詞“is” “This”和“island”。
/bis/匹配單字“is”和“island”中的“is”,不匹配“This”
??元字元“B”對除單字邊界以外的部分進行配對。
/BisB/ 將明確的指示不與單字的左、右邊界匹配,只匹配單字的內部。所以在這個例子中沒有結果。
/Bis/匹配單字“This”中的“is”

重複匹配

正則表達式中有一些用於重複匹配某些原子的元字符:“?”、“*” 、「+」。他們主要的差異是重複配對的次數不同。

??元字元「?」:表示0次或1次匹配緊接在其前面的原子。
例如:/colou?r/匹配“colour”或“color”。
??元字元「*」:表示0次、1次或多次匹配緊接在其前的原子。
例如:/zo*/可以匹配z、zoo
??元字元「+」:表示1次或多次匹配緊接在其前的原子。
例如:/go+gle/符合「gogle」、「google」或「gooogle」等中間含有多個o的字串。

任何一個字元

元字元「.」符合除換行符外任何一個字元。

??相當於:[^n](Unix系統)或[^rn](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」、「匹配例如「z2」、「匹配例如」 t6”、「g7」
??/0[xX][0-9a-fA-F]/符合一個簡單的十六進位數字,如「0x9」。
??/[^0-9a-zA-Z_]/匹配除英文字母、數字和下劃線以外任何一個字符,其等價於W。
??/0?[ xX][0-9a-fA-F]+/匹配十六進位數字,可以符合「0x9B3C」或「X800」等。
??//可以符合「

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

模式選擇符

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

模式單元

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

重新使用的模式單元

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


以上就介紹了正規表示式 (39),包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn