代码改变世界

正则表达式之单行模式、多行模式、区分大小写模式

2017-12-07 13:55  ZengGW  阅读(17862)  评论(0编辑  收藏  举报

正则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