Regex教程之模式修正符使用介紹

來源:互聯網
上載者:User

之前我們給大家介紹了Regex中的定界符、原子和元字元,那麼我們關於Regex教程的基本文法就剩下了Regex中的模式修正符。本節會向大家介紹模式修正符的概念、模式修正符的構成,以及結合執行個體的模式修正符的示範,大家在學習完本節內容之後,就完全可以讀懂Regex了。

什麼是模式修正符?

1, 模式修正符就是幾個字母,我們在每個Regex中可以一次使用一個,也可以連續使用多個,每一個具一定的意義。
2, 模式修正符是對整個Regex調優使用,也可以說是對Regex功能的擴充。
還記得Regex的那個公式嗎?'/原子和元字元/模式修正符',其中正斜線為邊界符。

模式修正符的構成
模式修正符就是字母,只不過這些在模式修正符的應用之中有特殊的含義。下面我來看看都有哪些模式修正符,請看下錶:

模式修正符 說明
i 表示在和模式進行匹配進不區分大小寫
m 將模式視為多行,使用^和$表示任何一行都可以以Regex開始或結束
s 如果沒有使用這個模式修正符號,元字元中的"."預設不能表示分行符號號,將字串視為單行
x 表示模式中的空白忽略不計
e Regex必須使用在preg_replace替換字串的函數中時才可以使用(講這個函數時再說)
A 以模式字串開頭,相當於元字元^
Z 以模式字串結尾,相當於元字元$
U Regex的特點:就是比較“貪婪”,使用該模式修正符可以取消貪婪模式

由於i表示匹配不區分大小寫,在下面的樣本中,我們不再進行示範,我們來看一下其他模式修正符的樣本。

1,模式修正符m。

複製代碼 代碼如下:<?php
$pattern = '/^abc/m';
$string = 'bcd
abc
cba';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

匹配結果是成功的。注意:我們在使用模式修正符m的時候,將匹配字串看成是多行而不是預設的單行,所以任何一行只要是以abc開頭,就匹配成功。但是,如果能匹配的行前面有空格的話,就不能匹配了!除非修改Regex的匹配模式。
2,模式修正符s。 複製代碼 代碼如下:<?php
$pattern = '/a.*c/s';
$string = 'adsadsa
c';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

這次的匹配記過也是成功的。如果你將上例中的模式修正符s去掉的話,匹配就會失敗。因為模式修正符s將匹配字串看作是單行的,所以這個時候,元字元中的"."就可以表示分行符號號了。
3,模式修正符x。 複製代碼 代碼如下:<?php
$pattern = '/a c/x';
$string = 'a c';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

這次的匹配結果是失敗的。因為我們使用模式修正符x取消了模式中的空格。注意:我們無法使用模式修正符取消\s表示的空白。
4,模式修正符A。 複製代碼 代碼如下:<?php
$pattern = '/ac/A';
$string = 'acahgyghvbm';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

Regex表示的含義是匹配以ac開頭的字串,結果成功。
模式修正符Z表示的是以字串結尾的匹配,和A的用法是一樣的,我們不再進行示範。
5,模式修正符U。
這個模式修正符是十分重要的!在Regex中,其本身是“貪婪”的。那什麼是貪婪模式呢?貪婪模式的意思就是說,Regex預設會在尋找到第一個匹配後,繼續嘗試後面的匹配,如果能找到匹配,則匹配最大的範圍字串。但有的時候這並不是我們想要的結果,所以我們需要取消貪婪模式。
我們還是先看一個貪婪模式的例子: 複製代碼 代碼如下:<?php
$pattern = '/<b>.*<\/b>/';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

這個執行個體的本意是匹配welcome,但是結果卻匹配了welcome to phpfuns整個字串(注意我們的字串'welcome to phpfuns',其開頭和結尾正好構成了Regex的模式比對,所以匹配成功),這就是Regex的貪婪模式。當然,這不是我們要的結果。

取消貪婪模式

我們可以使用模式修正符U和元字元?兩種方式取消Regex的貪婪模式。
模式修正符U取消貪婪模式 複製代碼 代碼如下:<?php
$pattern = '/<b>.*<\/b>/U';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

元字元?取消貪婪模式 複製代碼 代碼如下:<?php
$pattern = '/<b>.*?<\/b>/';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

注意元字元的位置,我們必須在“”之前結束貪婪模式,才能達到我們的目的,匹配welcome!
本節我們介紹了Regex中的模式修正符,Regex的貪婪模式以及示範了Regex中模式修正符的使用方法。到此為止,基本的Regex文法構成我們也學習完了。在下一節,我們介紹一些常用的Regex,供大家查閱使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.