柚子快報激活碼778899分享:正則表達式(語法大全)
正則表達式 - 語法
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
例如:
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 號代表前面的字符必須至少出現(xiàn)一次(1次或多次)。runoo*b,可以匹配 runob、runoob、runoooooob 等,***** 號代表前面的字符可以不出現(xiàn),也可以出現(xiàn)一次或者多次(0次、或1次、或多次)。colou?r 可以匹配 color 或者 colour,? 問號代表前面的字符最多只可以出現(xiàn)一次(0次或1次)。
構(gòu)造正則表達式的方法和創(chuàng)建數(shù)學表達式的方法一樣。也就是用多種元字符與運算符可以將小的表達式結(jié)合在一起來創(chuàng)建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數(shù)字、所有標點符號和一些其他符號。
字符描述[ABC]匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。[^ABC]匹配除了 […] 中字符的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字母。[A-Z][A-Z] 表示一個區(qū)間,匹配所有大寫字母,[a-z] 表示所有小寫字母。.匹配除換行符(\n、\r)之外的任何單個字符,相等于 [^\n\r]。[\s\S]匹配所有。\s 是匹配所有空白符,包括換行,\S 非空白符,不包括換行。\w匹配字母、數(shù)字、下劃線。等價于 [A-Za-z0-9_]
非打印字符
非打印字符也可以是正則表達式的組成部分。下表列出了表示非打印字符的轉(zhuǎn)義序列:
字符描述\cx匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 ‘c’ 字符。\f匹配一個換頁符。等價于 \x0c 和 \cL。\n匹配一個換行符。等價于 \x0a 和 \cJ。\r匹配一個回車符。等價于 \x0d 和 \cM。\s匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符。\S匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。\t匹配一個制表符。等價于 \x09 和 \cI。\v匹配一個垂直制表符。等價于 \x0b 和 \cK。
特殊字符
所謂特殊字符,就是一些有特殊含義的字符,如上面說的 runoo*b 中的 *****,簡單的說就是表示任何字符串的意思。如果要查找字符串中的 ***** 符號,則需要對 ***** 進行轉(zhuǎn)義,即在其前加一個 ****,runo*ob 匹配字符串 runo*ob。
許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將反斜杠字符**** 放在它們前面。下表列出了正則表達式中的特殊字符:
特別字符描述$匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,請使用 $。( )標記一個子表達式的開始和結(jié)束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 ( 和 )。*匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 *。+匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 +。.匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 . 。[標記一個中括號表達式的開始。要匹配 [,請使用 [。?匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 ?。\將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉(zhuǎn)義符。例如, ‘n’ 匹配字符 ‘n’?!甛n’ 匹配換行符。序列 ‘\’ 匹配 “”,而 ‘(’ 則匹配 “(”。^匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配 ^ 字符本身,請使用 ^。{標記限定符表達式的開始。要匹配 {,請使用 {。|指明兩項之間的一個選擇。要匹配 |,請使用 |。
限定符
限定符用來指定正則表達式的一個給定組件必須要出現(xiàn)多少次才能滿足匹配。有 ***** 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種。
正則表達式的限定符有:
字符描述*匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價于{0,}。+匹配前面的子表達式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價于 {1,}。?匹配前面的子表達式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等價于 {0,1}。{n}n 是一個非負整數(shù)。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o。{n,}n 是一個非負整數(shù)。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o?!畂{1,}’ 等價于 ‘o+’。‘o{0,}’ 則等價于 ‘o*’。{n,m}m 和 n 均為非負整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 將匹配 “fooooood” 中的前三個 o?!畂{0,1}’ 等價于 ‘o?’。請注意在逗號和兩個數(shù)之間不能有空格。
以下正則表達式匹配一個正整數(shù),[1-9]設(shè)置第一個數(shù)字不是 0,[0-9]* 表示任意多個數(shù)字:
/[1-9][0-9]*/
請注意,限定符出現(xiàn)在范圍表達式之后。因此,它應(yīng)用于整個范圍表達式,在本例中,只指定從 0 到 9 的數(shù)字(包括 0 和 9)。
這里不使用 + 限定符,因為在第二個位置或后面的位置不一定需要有一個數(shù)字。也不使用 ? 字符,因為使用 ? 會將整數(shù)限制到只有兩位數(shù)。
如果你想設(shè)置 0~99 的兩位數(shù),可以使用下面的表達式來至少指定一位但至多兩位數(shù)字。
/[0-9]{1,2}/
上面的表達式的缺點是,只能匹配兩位數(shù)字,而且可以匹配 0、00、01、10 99 的章節(jié)編號仍只匹配開頭兩位數(shù)字。
改進下,匹配 1~99 的正整數(shù)表達式如下:
/[1-9][0-9]?/
或
/[1-9][0-9]{0,1}/
** 和 *+** 限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個 ? 就可以實現(xiàn)非貪婪或最小匹配。**
例如,您可能搜索 HTML 文檔,以查找在 h1 標簽內(nèi)的內(nèi)容。HTML 代碼如下:
RUNOOB-菜鳥教程
**貪婪:**下面的表達式匹配從開始小于符號 (<) 到關(guān)閉 h1 標記的大于符號 (>) 之間的所有內(nèi)容。
/<.*>/
**非貪婪:**如果您只需要匹配開始和結(jié)束 h1 標簽,下面的非貪婪表達式只匹配
。
/<.*?>/
也可以使用以下正則表達式來匹配 h1 標簽,表達式則是:
/<\w+?>/
通過在 *、+ 或 ? 限定符之后放置 ?,該表達式從"貪婪"表達式轉(zhuǎn)換為"非貪婪"表達式或者最小匹配。
定位符
定位符使您能夠?qū)⒄齽t表達式固定到行首或行尾。它們還使您能夠創(chuàng)建這樣的正則表達式,這些正則表達式出現(xiàn)在一個單詞內(nèi)、在一個單詞的開頭或者一個單詞的結(jié)尾。
定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開始與結(jié)束,\b 描述單詞的前或后邊界,\B 表示非單詞邊界。
正則表達式的定位符有:
字符描述^匹配輸入字符串開始的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 之后的位置匹配。$匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置匹配。\b匹配一個單詞邊界,即字與空格間的位置。\B非單詞邊界匹配。
注意:不能將限定符與定位符一起使用。由于在緊靠換行或者單詞邊界的前面或后面不能有一個以上位置,因此不允許諸如 ^* 之類的表達式。
若要匹配一行文本開始處的文本,請在正則表達式的開始使用 ^ 字符。不要將 ^ 的這種用法與中括號表達式內(nèi)的用法混淆。
若要匹配一行文本的結(jié)束處的文本,請在正則表達式的結(jié)束處使用 $ 字符。
若要在搜索章節(jié)標題時使用定位點,下面的正則表達式匹配一個章節(jié)標題,該標題只包含兩個尾隨數(shù)字,并且出現(xiàn)在行首:
/^Chapter [1-9][0-9]{0,1}/
真正的章節(jié)標題不僅出現(xiàn)行的開始處,而且它還是該行中僅有的文本。它既出現(xiàn)在行首又出現(xiàn)在同一行的結(jié)尾。下面的表達式能確保指定的匹配只匹配章節(jié)而不匹配交叉引用。通過創(chuàng)建只匹配一行文本的開始和結(jié)尾的正則表達式,就可做到這一點。
/^Chapter [1-9][0-9]{0,1}$/
匹配單詞邊界稍有不同,但向正則表達式添加了很重要的能力。單詞邊界是單詞和空格之間的位置。非單詞邊界是任何其他位置。下面的表達式匹配單詞 Chapter 的開頭三個字符,因為這三個字符出現(xiàn)在單詞邊界后面:
/\bCha/
\b 字符的位置是非常重要的。如果它位于要匹配的字符串的開始,它在單詞的開始處查找匹配項。如果它位于字符串的結(jié)尾,它在單詞的結(jié)尾處查找匹配項。例如,下面的表達式匹配單詞 Chapter 中的字符串 ter,因為它出現(xiàn)在單詞邊界的前面:
/ter\b/
下面的表達式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt:
/\Bapt/
字符串 apt 出現(xiàn)在單詞 Chapter 中的非單詞邊界處,但出現(xiàn)在單詞 aptitude 中的單詞邊界處。對于 \B 非單詞邊界運算符,不可以匹配單詞的開頭或結(jié)尾,如果是下面的表達式,就不匹配 Chapter 中的 Cha:
\BCha
選擇
用圓括號 () 將所有選擇項括起來,相鄰的選擇項之間用 | 分隔。
() 表示捕獲分組,() 會把每個分組里的匹配的值保存起來, 多個匹配值可以通過數(shù)字 n 來查看(n 是一個數(shù)字,表示第 n 個捕獲組的內(nèi)容)。
在這里插入圖片描述
但用圓括號會有一個副作用,使相關(guān)的匹配會被緩存,此時可用 ?: 放在第一個選項前來消除這種副作用。
其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?!,這兩個還有更多的含義,前者為正向預(yù)查,在任何開始匹配圓括號內(nèi)的正則表達式模式的位置來匹配搜索字符串,后者為負向預(yù)查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。
以下列出 ?=、?<=、?!、?
exp1(?=exp2):查找 exp2 前面的 exp1。
(?<=exp2)exp1:查找 exp2 后面的 exp1。
exp1(?!exp2):查找后面不是 exp2 的 exp1。
(?
更多內(nèi)容可以參考:正則表達式的先行斷言(lookahead)和后行斷言(lookbehind)
反向引用
對一個正則表達式模式或部分模式兩邊添加圓括號將導(dǎo)致相關(guān)匹配存儲到一個臨時緩沖區(qū)中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現(xiàn)的順序存儲。緩沖區(qū)編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區(qū)都可以使用 \n 訪問,其中 n 為一個標識特定緩沖區(qū)的一位或兩位十進制數(shù)。
可以使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關(guān)匹配的保存。
反向引用的最簡單的、最有用的應(yīng)用之一,是提供查找文本中兩個相同的相鄰單詞的匹配項的能力。以下面的句子為例:
Is is the cost of of gasoline going up up?
上面的句子很顯然有多個重復(fù)的單詞。如果能設(shè)計一種方法定位該句子,而不必查找每個單詞的重復(fù)出現(xiàn),那該有多好。下面的正則表達式使用單個子表達式來實現(xiàn)這一點:
實例
查找重復(fù)的單詞:
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));
捕獲的表達式,正如 [a-z]+ 指定的,包括一個或多個字母。正則表達式的第二部分是對以前捕獲的子匹配項的引用,即,單詞的第二個匹配項正好由括號表達式匹配。\1 指定第一個子匹配項。
單詞邊界元字符確保只檢測整個單詞。否則,諸如 “is issued” 或 “this is” 之類的詞組將不能正確地被此表達式識別。
正則表達式后面的全局標記 g 指定將該表達式應(yīng)用到輸入字符串中能夠查找到的盡可能多的匹配。
表達式的結(jié)尾處的不區(qū)分大小寫 i 標記指定不區(qū)分大小寫。
多行標記指定換行符的兩邊可能出現(xiàn)潛在的匹配。
反向引用還可以將通用資源指示符 (URI) 分解為其組件。假定您想將下面的 URI 分解為協(xié)議(ftp、http 等等)、域地址和頁/路徑:
https://www.runoob.com:80/html/html-tutorial.html
下面的正則表達式提供該功能:
實例
輸出所有匹配的數(shù)據(jù):
var str = "https://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
for (var i = 0; i < arr.length ; i++) {
document.write(arr[i]);
document.write("
");
}
第三行代碼 str.match(patt1) 返回一個數(shù)組,實例中的數(shù)組包含 5 個元素,索引 0 對應(yīng)的是整個字符串,索引 1 對應(yīng)第一個匹配符(括號內(nèi)),以此類推。
第一個括號子表達式捕獲 Web 地址的協(xié)議部分。該子表達式匹配在冒號和兩個正斜杠前面的任何單詞。
第二個括號子表達式捕獲地址的域地址部分。子表達式匹配非 : 和 / 之后的一個或多個字符。
第三個括號子表達式捕獲端口號(如果指定了的話)。該子表達式匹配冒號后面的零個或多個數(shù)字。只能重復(fù)一次該子表達式。
最后,第四個括號子表達式捕獲 Web 地址指定的路徑和 / 或頁信息。該子表達式能匹配不包括 # 或空格字符的任何字符序列。
將正則表達式應(yīng)用到上面的 URI,各子匹配項包含下面的內(nèi)容:
第一個括號子表達式包含 http第二個括號子表達式包含 www.runoob.com第三個括號子表達式包含 :80第四個括號子表達式包含 /html/html-tutorial.html
正則表達式 - 修飾符(標記)
標記也稱為修飾符,正則表達式的標記用于指定額外的匹配策略。
標記不寫在正則表達式里,標記位于表達式之外,格式如下:
/pattern/flags
下表列出了正則表達式常用的修飾符:
修飾符含義描述iignore - 不區(qū)分大小寫將匹配設(shè)置為不區(qū)分大小寫,搜索時不區(qū)分大小寫: A 和 a 沒有區(qū)別。gglobal - 全局匹配查找所有的匹配項。mmulti line - 多行匹配使邊界字符 ^ 和 $ 匹配每一行的開頭和結(jié)尾,記住是多行,而不是整個字符串的開頭和結(jié)尾。s特殊字符圓點 . 中包含換行符 \n默認情況下的圓點 . 是 匹配除換行符 \n 之外的任何字符,加上 s 修飾符之后, . 中包含換行符 \n。
g 修飾符
g 修飾符可以查找字符串中所有的匹配項:
實例
在字符串中查找 “runoob”:
var str="Google runoob taobao runoob";
var n1=str.match(/runoob/); // 查找第一次匹配項
var n2=str.match(/runoob/g); // 查找所有匹配項
i 修飾符
i 修飾符為不區(qū)分大小寫匹配,實例如下:
實例
在字符串中查找 “runoob”:
var str="Google runoob taobao RUNoob";
var n1=str.match(/runoob/g); // 區(qū)分大小寫
var n2=str.match(/runoob/gi); // 不區(qū)分大小寫
m 修飾符
m 修飾符可以使 ^ 和 $ 匹配一段文本中每行的開始和結(jié)束位置。
g 只匹配第一行,添加 m 之后實現(xiàn)多行。
以下實例字符串中使用 \n 來換行:
實例
在字符串中查找 “runoob”:
var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g); // 匹配一個
var n2=str.match(/^runoob/gm); // 多行匹配
s 修飾符
默認情況下的圓點 . 是 匹配除換行符 \n 之外的任何字符,加上 s 之后, . 中包含換行符 \n。
s 修飾符實例如下:
實例
在字符串中查找:
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./); // 沒有使用 s,無法匹配\n
var n2=str.match(/runoob./s); // 使用 s,匹配\n
正則表達式 - 元字符
下表包含了元字符的完整列表以及它們在正則表達式上下文中的行為:
字符描述\將下一個字符標記為一個特殊字符、或一個原義字符、或一個 向后引用、或一個八進制轉(zhuǎn)義符。例如,‘n’ 匹配字符 “n”?!甛n’ 匹配一個換行符。序列 ‘\’ 匹配 “” 而 “(” 則匹配 “(”。^匹配輸入字符串的開始位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。$匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對象的 Multiline 屬性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。*匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價于{0,}。+匹配前面的子表達式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價于 {1,}。?匹配前面的子表達式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等價于 {0,1}。{n}n 是一個非負整數(shù)。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o。{n,}n 是一個非負整數(shù)。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o?!畂{1,}’ 等價于 ‘o+’?!畂{0,}’ 則等價于 ‘o*’。{n,m}m 和 n 均為非負整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 將匹配 “fooooood” 中的前三個 o。‘o{0,1}’ 等價于 ‘o?’。請注意在逗號和兩個數(shù)之間不能有空格。?當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串 “oooo”,‘o+?’ 將匹配單個 “o”,而 ‘o+’ 將匹配所有 ‘o’。.匹配除換行符(\n、\r)之外的任何單個字符。要匹配包括 ‘\n’ 在內(nèi)的任何字符,請使用像"(.|\n)"的模式。(pattern)匹配 pattern 并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要匹配圓括號字符,請使用 ‘(’ 或 ‘)’。(?:pattern)匹配 pattern 但不獲取匹配結(jié)果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用 “或” 字符 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 ‘industry|industries’ 更簡略的表達式。(?=pattern)正向肯定預(yù)查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)“能匹配"Windows2000"中的"Windows”,但不能匹配"Windows3.1"中的"Windows”。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。(?!pattern)正向否定預(yù)查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。(?<=pattern)反向(look behind)肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。例如,"`(?<=95(?
實例
接下來我們分析一個匹配郵箱的正則表達式,如下圖:
實例
var str = "abcd test@runoob.com 1234";
var patt1 = /\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g; document.write(str.match(patt1));
以下標記的文本是獲得的匹配的表達式:
test@runoob.com
正則表達式 - 運算符優(yōu)先級
正則表達式從左到右進行計算,并遵循優(yōu)先級順序,這與算術(shù)表達式非常類似。
相同優(yōu)先級的從左到右進行運算,不同優(yōu)先級的運算先高后低。下表從最高到最低說明了各種正則表達式運算符的優(yōu)先級順序:
運算符描述\轉(zhuǎn)義符(), (?:), (?=), []圓括號和方括號*, +, ?, {n}, {n,}, {n,m}限定符^, $, \任何元字符、任何字符定位點和序列(即:位置和順序)|替換,“或"操作 字符具有高于替換運算符的優(yōu)先級,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",請使用括號創(chuàng)建子表達式,從而產(chǎn)生"(m|f)ood"。
正則表達式 - 匹配規(guī)則
基本模式匹配
一切從最基本的開始。模式,是正則表達式最基本的元素,它們是一組描述字符串特征的字符。模式可以很簡單,由普通的字符串組成,也可以非常復(fù)雜,往往用特殊的字符表示一個范圍內(nèi)的字符、重復(fù)出現(xiàn),或表示上下文。例如:
^once
這個模式包含一個特殊的字符 ^,表示該模式只匹配那些以 once 開頭的字符串。例如該模式與字符串 “once upon a time” 匹配,與 “There once was a man from NewYork” 不匹配。正如如 ^ 符號表示開頭一樣,$ 符號用來匹配那些以給定模式結(jié)尾的字符串。
bucket$
這個模式與 “Who kept all of this cash in a bucket” 匹配,與 “buckets” 不匹配。字符 ^ 和 $ 同時使用時,表示精確匹配(字符串與模式一樣)。例如:
^bucket$
只匹配字符串 “bucket”。如果一個模式不包括 ^ 和 $,那么它與任何包含該模式的字符串匹配。例如模式:
once
與字符串
There once was a man from NewYork
Who kept all of his cash in a bucket.
是匹配的。
在該模式中的字母 (o-n-c-e) 是字面的字符,也就是說,他們表示該字母本身,數(shù)字也是一樣的。其他一些稍微復(fù)雜的字符,如標點符號和白字符(空格、制表符等),要用到轉(zhuǎn)義序列。所有的轉(zhuǎn)義序列都用反斜杠 ** 打頭。制表符的轉(zhuǎn)義序列是 \t。所以如果我們要檢測一個字符串是否以制表符開頭,可以用這個模式:
^\t
類似的,用 \n 表示**“新行”,\r** 表示回車。其他的特殊符號,可以用在前面加上反斜杠,如反斜杠本身用 \ 表示,句號 . 用 . 表示,以此類推。
字符簇
在 INTERNET 的程序中,正則表達式通常用來驗證用戶的輸入。當用戶提交一個 FORM 以后,要判斷輸入的電話號碼、地址、EMAIL 地址、信用卡號碼等是否有效,用普通的基于字面的字符是不夠的。
所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個表示所有元音字符的字符簇,就把所有的元音字符放在一個方括號里:
[AaEeIiOoUu]
這個模式與任何元音字符匹配,但只能表示一個字符。用連字號可以表示一個字符的范圍,如:
[a-z] // 匹配所有的小寫字母
[A-Z] // 匹配所有的大寫字母
[a-zA-Z] // 匹配所有的字母
[0-9] // 匹配所有的數(shù)字
[0-9\.\-] // 匹配所有的數(shù)字,句號和減號
[ \f\r\t\n] // 匹配所有的白字符
同樣的,這些也只表示一個字符,這是一個非常重要的。如果要匹配一個由一個小寫字母和一位數(shù)字組成的字符串,比如 “z2”、“t6” 或 “g7”,但不是 “ab2”、“r2d3” 或 “b52” 的話,用這個模式:
^[a-z][0-9]$
盡管 [a-z] 代表 26 個字母的范圍,但在這里它只能與第一個字符是小寫字母的字符串匹配。
前面曾經(jīng)提到^表示字符串的開頭,但它還有另外一個含義。當在一組方括號里使用 ^ 時,它表示"非"或"排除"的意思,常常用來剔除某個字符。還用前面的例子,我們要求第一個字符不能是數(shù)字:
^[^0-9][0-9]$
這個模式與 “&5”、“g7"及”-2" 是匹配的,但與 “12”、“66” 是不匹配的。下面是幾個排除特定字符的例子:
[^a-z] //除了小寫字母以外的所有字符
[^\\\/\^] //除了(\)(/)(^)之外的所有字符
[^\"\'] //除了雙引號(")和單引號(')之外的所有字符
特殊字符 .(點,句號)在正則表達式中用來表示除了"新行"之外的所有字符。所以模式 ^.5$ 與任何兩個字符的、以數(shù)字5結(jié)尾和以其他非"新行"字符開頭的字符串匹配。模式 . 可以匹配任何字符串,換行符(\n、\r)除外。
PHP的正則表達式有一些內(nèi)置的通用字符簇,列表如下:
字符簇描述[[:alpha:]]任何字母[[:digit:]]任何數(shù)字[[:alnum:]]任何字母和數(shù)字[[:space:]]任何空白字符[[:upper:]]任何大寫字母[[:lower:]]任何小寫字母[[:punct:]]任何標點符號[[:xdigit:]]任何16進制的數(shù)字,相當于[0-9a-fA-F]
確定重復(fù)出現(xiàn)
到現(xiàn)在為止,你已經(jīng)知道如何去匹配一個字母或數(shù)字,但更多的情況下,可能要匹配一個單詞或一組數(shù)字。一個單詞有若干個字母組成,一組數(shù)字有若干個單數(shù)組成。跟在字符或字符簇后面的花括號({})用來確定前面的內(nèi)容的重復(fù)出現(xiàn)的次數(shù)。
字符簇描述^a$字母a^a{4}$aaaa^a{2,4}$aa,aaa或aaaa^a{1,3}$a,aa或aaa^a{2,}$包含多于兩個a的字符串^a{2,}如:aardvark和aaab,但apple不行a{2,}如:baad和aaa,但Nantucket不行\(zhòng)t{2}兩個制表符.{2}所有的兩個字符
^[a-zA-Z_]$ // 所有的字母和下劃線
^[[:alpha:]]{3}$ // 所有的3個字母的單詞
這些例子描述了花括號的三種不同的用法。一個數(shù)字 {x} 的意思是前面的字符或字符簇只出現(xiàn)x次 ;一個數(shù)字加逗號 {x,} 的意思是前面的內(nèi)容出現(xiàn)x或更多的次數(shù) ;兩個數(shù)字用逗號分隔的數(shù)字 {x,y} 表示 前面的內(nèi)容至少出現(xiàn)x次,但不超過y次。我們可以把模式擴展到更多的單詞或數(shù)字:
^[a-zA-Z0-9_]{1,}$ // 所有包含一個以上的字母、數(shù)字或下劃線的字符串
^[1-9][0-9]{0,}$ // 所有的正整數(shù)
^\-{0,1}[0-9]{1,}$ // 所有的整數(shù)
^[-]?[0-9]+\.?[0-9]+$ // 所有的浮點數(shù)
最后一個例子不太好理解,是嗎?這么看吧:以一個可選的負號 ([-]?) 開頭 (^)、跟著1個或更多的數(shù)字([0-9]+)、和一個小數(shù)點(.)再跟上1個或多個數(shù)字**([0-9]+),并且后面沒有其他任何東西($**)。下面你將知道能夠使用的更為簡單的方法。
特殊字符 ? 與 {0,1} 是相等的,它們都代表著: 0個或1個前面的內(nèi)容 或 前面的內(nèi)容是可選的 。所以剛才的例子可以簡化為:
^\-?[0-9]{1,}\.?[0-9]{1,}$
特殊字符 ***** 與 {0,} 是相等的,它們都代表著 0 個或多個前面的內(nèi)容 。最后,字符 + 與 {1,} 是相等的,表示 1 個或多個前面的內(nèi)容 ,所以上面的4個例子可以寫成:
^[a-zA-Z0-9_]+$ // 所有包含一個以上的字母、數(shù)字或下劃線的字符串
^[1-9][0-9]*$ // 所有的正整數(shù)
^\-?[0-9]+$ // 所有的整數(shù)
^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮點數(shù)
當然這并不能從技術(shù)上降低正則表達式的復(fù)雜性,但可以使它們更容易閱讀。
正則表達式 - 示例
簡單表達式
正則表達式的最簡單形式是在搜索字符串中匹配其本身的單個普通字符。例如,單字符模式,如 A,不論出現(xiàn)在搜索字符串中的何處,它總是匹配字母 A。下面是一些單字符正則表達式模式的示例:
/a/
/7/
/M/
可以將許多單字符組合起來以形成大的表達式。例如,以下正則表達式組合了單字符表達式:a、7 和 M。
/a7M/
請注意,沒有串聯(lián)運算符。只須在一個字符后面鍵入另一個字符。
字符匹配
句點 (.) 匹配字符串中的各種打印或非打印字符,只有一個字符例外。這個例外就是換行符 (\n)。下面的正則表達式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:
/a.c/
若要匹配包含文件名的字符串,而句點 (.) 是輸入字符串的組成部分,請在正則表達式中的句點前面加反斜杠 () 字符。舉例來說明,下面的正則表達式匹配 filename.ext:
/filename\.ext/
這些表達式只讓您匹配"任何"單個字符??赡苄枰ヅ淞斜碇械奶囟ㄗ址M。例如,可能需要查找用數(shù)字表示的章節(jié)標題(Chapter 1、Chapter 2 等等)。
中括號表達式
若要創(chuàng)建匹配字符組的一個列表,請在方括號([ 和 ])內(nèi)放置一個或更多單個字符。當字符括在中括號內(nèi)時,該列表稱為"中括號表達式"。與在任何別的位置一樣,普通字符在中括號內(nèi)表示其本身,即,它在輸入文本中匹配一次其本身。大多數(shù)特殊字符在中括號表達式內(nèi)出現(xiàn)時失去它們的意義。不過也有一些例外,如:
如果 ] 字符不是第一項,它結(jié)束一個列表。若要匹配列表中的 ] 字符,請將它放在第一位,緊跟在開始 [ 后面。\ 字符繼續(xù)作為轉(zhuǎn)義符。若要匹配 \ 字符,請使用 \。
括在中括號表達式中的字符只匹配處于正則表達式中該位置的單個字符。以下正則表達式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5:
/Chapter [12345]/
請注意,單詞 Chapter 和后面的空格的位置相對于中括號內(nèi)的字符是固定的。中括號表達式指定的只是匹配緊跟在單詞 Chapter 和空格后面的單個字符位置的字符集。這是第九個字符位置。
若要使用范圍代替字符本身來表示匹配字符組,請使用連字符 (-) 將范圍中的開始字符和結(jié)束字符分開。單個字符的字符值確定范圍內(nèi)的相對順序。下面的正則表達式包含范圍表達式,該范圍表達式等效于上面顯示的中括號中的列表。
/Chapter [1-5]/
當以這種方式指定范圍時,開始值和結(jié)束值兩者都包括在范圍內(nèi)。注意,還有一點很重要,按 Unicode 排序順序,開始值必須在結(jié)束值的前面。
若要在中括號表達式中包括連字符,請采用下列方法之一:
用反斜杠將它轉(zhuǎn)義: [\-]
將連字符放在中括號列表的開始或結(jié)尾。下面的表達式匹配所有小寫字母和連字符: [-a-z]
[a-z-]
創(chuàng)建一個范圍,在該范圍中,開始字符值小于連字符,而結(jié)束字符值等于或大于連字符。下面的兩個正則表達式都滿足這一要求: [!--]
[!-~]
若要查找不在列表或范圍內(nèi)的所有字符,請將插入符號 (^) 放在列表的開頭。如果插入字符出現(xiàn)在列表中的其他任何位置,則它匹配其本身。下面的正則表達式匹配1、2、3、4 或 5 之外的任何數(shù)字和字符:
/Chapter [^12345]/
在上面的示例中,表達式在第九個位置匹配 1、2、3、4 或 5 之外的任何數(shù)字和字符。這樣,例如,Chapter 7 就是一個匹配項,Chapter 9 也是一個匹配項。
上面的表達式可以使用連字符 (-) 來表示:
/Chapter [^1-5]/
中括號表達式的典型用途是指定任何大寫或小寫字母或任何數(shù)字的匹配。下面的表達式指定這樣的匹配:
/[A-Za-z0-9]/
替換和分組
替換使用 | 字符來允許在兩個或多個替換選項之間進行選擇。例如,可以擴展章節(jié)標題正則表達式,以返回比章標題范圍更廣的匹配項。但是,這并不象您可能認為的那樣簡單。替換匹配 | 字符任一側(cè)最大的表達式。
您可能認為,下面的表達式匹配出現(xiàn)在行首和行尾、后面跟一個或兩個數(shù)字的 Chapter 或 Section:
/^Chapter|Section [1-9][0-9]{0,1}$/
很遺憾,上面的正則表達式要么匹配行首的單詞 Chapter,要么匹配行尾的單詞 Section 及跟在其后的任何數(shù)字。如果輸入字符串是 Chapter 22,那么上面的表達式只匹配單詞 Chapter。如果輸入字符串是 Section 22,那么該表達式匹配 Section 22。
若要使正則表達式更易于控制,可以使用括號來限制替換的范圍,即,確保它只應(yīng)用于兩個單詞 Chapter 和 Section。但是,括號也用于創(chuàng)建子表達式,并可能捕獲它們以供以后使用,這一點在有關(guān)反向引用的那一節(jié)講述。通過在上面的正則表達式的適當位置添加括號,就可以使該正則表達式匹配 Chapter 1 或 Section 3。
下面的正則表達式使用括號來組合 Chapter 和 Section,以便表達式正確地起作用:
/^(Chapter|Section) [1-9][0-9]{0,1}$/
盡管這些表達式正常工作,但 Chapter|Section 周圍的括號還將捕獲兩個匹配字中的任一個供以后使用。由于在上面的表達式中只有一組括號,因此,只有一個被捕獲的"子匹配項"。
在上面的示例中,您只需要使用括號來組合單詞 Chapter 和 Section 之間的選擇。若要防止匹配被保存以備將來使用,請在括號內(nèi)正則表達式模式之前放置 ?:。下面的修改提供相同的能力而不保存子匹配項:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
除 ?: 元字符外,兩個其他非捕獲元字符創(chuàng)建被稱為"預(yù)測先行"匹配的某些內(nèi)容。正向預(yù)測先行使用 ?= 指定,它匹配處于括號中匹配正則表達式模式的起始點的搜索字符串。反向預(yù)測先行使用 ?! 指定,它匹配處于與正則表達式模式不匹配的字符串的起始點的搜索字符串。
例如,假設(shè)您有一個文檔,該文檔包含指向 Windows 3.1、Windows 95、Windows 98 和 Windows NT 的引用。再進一步假設(shè),您需要更新該文檔,將指向 Windows 95、Windows 98 和 Windows NT 的所有引用更改為 Windows 2000。下面的正則表達式(這是一個正向預(yù)測先行的示例)匹配 Windows 95、Windows 98 和 Windows NT:
/Windows(?=95 |98 |NT )/
找到一處匹配后,緊接著就在匹配的文本(不包括預(yù)測先行中的字符)之后搜索下一處匹配。例如,如果上面的表達式匹配 Windows 98,將在 Windows 之后而不是在 98 之后繼續(xù)搜索。
其他示例
下面列出一些正則表達式示例:
正則表達式描述/\b([a-z]+) \1\b/gi一個單詞連續(xù)出現(xiàn)的位置。/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/匹配一個 URL 解析為協(xié)議、域、端口及相對路徑。/^(?:Chapter|Section) [1-9][0-9]{0,1}$/定位章節(jié)的位置。/[-a-z]/a 至 z 共 26個 字母再加一個 - 號。/ter\b/可匹配 chapter,而不能匹配 terminal。/\Bapt/可匹配 chapter,而不能匹配 aptitude。/Windows(?=95 |98 |NT )/可匹配 Windows95 或 Windows98 或 WindowsNT,當找到一個匹配后,從 Windows 后面開始進行下一次的檢索匹配。/^\s*$/匹配空行。/\d{2}-\d{5}/驗證由兩位數(shù)字、一個連字符再加 5 位數(shù)字組成的 ID 號。<[a-zA-Z]+.?>([\s\S]?)匹配 HTML 標記。
正則表達式描述hello匹配 {hello}gr[ae]y匹配 {gray, grey}b[aeiou]bble匹配 {babble, bebble, bibble, bobble, bubble}colou?r匹配 {color, colour}go*gle匹配 {ggle, gogle, google, gooogle, goooogle, …}go+gle匹配 {gogle, google, gooogle, goooogle, …}g(oog)+le匹配 {google, googoogle, googoogoogle, googoogoogoogle, …}z{3}匹配 {zzz}z{3,6}匹配 {zzz, zzzz, zzzzz, zzzzzz}z{3,}匹配 {zzz, zzzz, zzzzz, …}[Bb]rainf\*\*k匹配 {Brainfk, brainfk}\d匹配 {0,1,2,3,4,5,6,7,8,9}1\d{10}匹配 11 個數(shù)字,以 1 開頭Hello\nworld匹配 Hello 后跟換行符,后跟 world\d+(\.\d\d)?包含一個正整數(shù)或包含兩位小數(shù)位的浮點數(shù)。[^*@#]排除 *、@ 、# 三個特色符號//[^\r\n]*[\r\n]匹配 // 開頭的注釋^dog匹配以 “dog” 開始dog$匹配以 “dog” 結(jié)尾^dog$is exactly “dog”\d匹配 {0,1,2,3,4,5,6,7,8,9}1\d{10}匹配 11 個數(shù)字,以 1 開頭Hello\nworld匹配 Hello 后跟換行符,后跟 world\d+(\.\d\d)?包含一個正整數(shù)或包含兩位小數(shù)位的浮點數(shù)。[^*@#]排除 *、@ 、# 三個特色符號//[^\r\n]*[\r\n]匹配 // 開頭的注釋^dog匹配以 “dog” 開始dog$匹配以 “dog” 結(jié)尾^dog$is exactly “dog”
gray|grey // 匹配 {gray, grey}
gr(a|e)y // 匹配 {gray, grey}
[b-chm-pP]at|ot // 匹配 {bat, cat, hat, mat, nat, oat, pat, Pat, ot}
rege(x(es)?|xps?) // 匹配 {regex, regexes, regexp, regexps}
柚子快報激活碼778899分享:正則表達式(語法大全)
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。