正則表達式之單行模式、多行模式、區分大小寫模式


正則regex有三種匹配模式:單行模式、多行模式、區分大小寫模式

說明:文章舉例說明使用的是php代碼和Regex Match Tracer工具來進行操作的

一、單行模式SingleLine 

  關鍵字:s

  描述:正則在單行模式的情況下會改變(.)點號的含義,why?【這里可能大家有個誤區,普遍認為(.)點號是匹配任意字符的,但是實際上(.)點號是不能匹配換行符的,在windows中它與[^\r\n]是等價的

$text = '<div id="div">
  123
  abc
  456
  def
</div>';
preg_match('/<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>/', $text, $match);
var_dump($match);
# 返回的結果是array(0){}

  因為在很多情況下我們都會使用到單行模式,比如經常會獲取html網頁源碼,然后進行重點匹配某些內容,那html源碼存在很多的換行和回車符,這個時候單行模式就很有作用了,上邊的代碼正則字符串中沒有使用任何的修飾符(<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>),直接進行匹配發現匹配失敗,原因上邊已經說了就是(.)點號是不能匹配換行符的,這是個誤區(注意),下面我們在正則表達式上添加單行模式關鍵字s來進行匹配:

$text = '<div id="div">
  123
  abc
  456
  def
</div>';
preg_match('/<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>/s', $text, $match);
var_dump($match['1']);
# 返回的結果是:
//string(30) "
//  123
//  abc
//  456
//  def
//"

 

重要的事情說三遍:(.)點號不匹配換行符,在windows中與[^\r\n]等價,並不是刻意匹配任意字符

二、多行模式MultiLine(使用php來操作看的不是很明顯)

  關鍵字:m

  描述:多行模式下會改變^和$的含義【^和$是匹配整個字符串的開頭和結尾】,使它在任意一行的行首和行尾進行匹配

  擴展:在支持此模式的程序通常都提供\A和\Z兩種修飾符,他們跟普通的^和$是一樣的作用,但是^和$在多行模式下會改變含義,而\A和\Z他們的含義始終不會被改變,一直都匹配整個字符的開頭和結尾

  

  這是沒有選擇多行模式的,匹配失敗,原因剛才也說了,接下來咱們選擇多行模式進行匹配:

  

  重要的事情說三遍:多行模式下^和$的含義會被改變,普通的含義是匹配整個字符串的開頭和結尾,在多行模式下匹配的就是每一行的行首和行尾

 三、不區分大小寫模式

  關鍵字:i

  描述:這個很好理解,就是當你使用了不區分大小寫模式匹配的時候,不論是大寫還是小寫都會匹配到

$text = 'The';
preg_match('/^the$/', $text, $match);
var_dump($match);
# 返回的結果是:array(0){}

  接下來使用關鍵字進行匹配:

$text = 'The';
preg_match('/^the$/i', $text, $match);
var_dump($match);
# 返回的結果是:
//array(1) {
//  [0]=>
//  string(3) "The"
//}

四、總結:

模式 定義 關鍵字
單行模式 (.)點號不匹配換行符,在windows中與[^\r\n]等價,並不是刻意匹配任意字符,在單行模式下會改變點號的含義,做到匹配任意字符    s
多行模式 多行模式下^和$的含義會被改變,普通的含義是匹配整個字符串的開頭和結尾,在多行模式下匹配的就是每一行的行首和行尾,而\A和\Z他們的含義始終是匹配整個字符串的開頭和結尾    m
不區分大小寫模式 指定不區分大小寫的匹配。     i


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM