phpoo之正则表达式篇<<天行键学习笔记>>

字符:

    实际字符,

    特殊字符(metacharacter 元字符):(11个) [ \ ^ $ . | ? * + ( )

    非打印字符:\t(\x09),\r(\x0D),\n(\x0A),\a(\x07),\e(\x1B),\f(form feed \x0C),\v(\x0B)

   

   

正则表达式引擎内部:

    先看看内部怎样工作:有两种正则表达式引擎:作用于文本的和作用于正则表达式的引擎。Jeffrey Friedl分别称它们为DFA和NFA引擎,像惰性量词和后向引用只能在基于正则表达式的引擎中。

    值得注意的是一些使用作用于文本的引擎的工具,awk,egrep,flex,lex,MySQL和Procmail。

    测试是什么引擎:就用 "/regex|regex not/"去匹配字符串“regex not” ,如果结果是“regex”,引擎是基于正则表达式的,反之为文本的。其原因是前者是急性子。

   

字符集合:

    [字符集合]:在[]中的元字符:^ – ] \ 四个。可以通过变换它们的位置让它们不是元字符,如:[]^-] ,[^]x]匹配非]和x 。

    快捷字符集合:

        \d 代表[0-9];

        \w 代表[a-zA-Z];

        \s 代表空白字符[\t ];有的flavor也有\r\n;

        \D 等同[^\d];

        \W 等同[^\w];

        [\D\S]不等同[^\d\s];

        [\s\S]匹配任何字符;

   

Dot点:

    通常用来匹配任何字符除了newline字符。这时可以用[.\n]在UNIX上,用[.\r\n]在windows上匹配任何字符;

    多行模式(\m)仅作用于锚点,单行模式(\s)仅作用于点(dot);

   

   

   

锚点(anchors):

    根本不匹配任何字符,代之的是它们匹配字符前面,后面或者是中间的位置。

    固定的开始和结束锚点:\A和\Z,\z。\z指绝对结束,还在line break的后面,而\Z或$在line break的前面。

    ^(插入符)和$不一定是字符串的开始和结束,有时还指行的开始和行的结束.

   

   

   

字的界限:

    \b就像一个锚点,匹配一个字的位置,当然也是零长度的。

    \B匹配与\b相反的位置。

   

   

选择(|):

    正则表达式引擎是急性的。Get|GetValue|Set|SetValue 只匹配SetValue中的Set。

   

   

   

可选的选项(?):

    ?使得它前面的标记成为可选的。

    它是贪婪的。如果要成为懒惰的得再加一个?。

   

   

重复(* +):

    限制重复{m},{m,n},m<n

    *等同于{0,},+等同于{1,}

    贪婪变惰性:*?,+?,一句话,匹配尽量少的字符。

   

   

分组和后向引用:

    (regex)就是分组,这样后面就可引用它。

    (?:regex)不会存储其中的值。

    一般通过\n来后向引用。

    \0指的是整个正则表达式所匹配的结果。

    ([abc]+)=\1  会匹配cab=cab,但是([abc])+=\1就不会。

    圆括号和后向引用不能用在字符集合中。比如(a)[\1b]就会等同于(a)[\x01b]。

   

   

   

命名的捕捉组:

    (?P<name>group)后向引用时用\1或者(?P=name);

    尽量不要把命名的捕捉组和没命名的混在一起。

   

Unicode:

    \X是unicode版的"."(dot)。不一样的是前者可以直接匹配line break,而后者不能。

    \p{L}

    \p{M}……

   

修饰符:

    匹配模式:/i,/s(单行模式,让dot匹配newlines),/m(多行模式,让^和$匹配newlines的前后)。

    在正则表达式里指定模式:如,(?ims)开放以上三个模式,(?-ims)关闭三个模式,(?i)te(?-i)st 就匹配 “test” 和“TEst”,但不能匹配“teST”。

    修饰符范围:比如 (?i)ignorecase(?-i)casesensitive(?i)ignorecase和(?i)ignorecase(?-i:casesensitive)ignorecase是等价的

   

自动分组和控制量词:

    为了避免贪婪和惰性的回溯严重的问题

    (?>regex)其中的regex被当作单个匹配标记。

    x++等同于(?>x+)

    x*+等同于(?>x*)

    x?+ =  (?>x?)

    x{m,n} = (?>x{m,n})

   

   

前向断言和后向断言(lookahead,lookbehind)

    它们合起来称为lookaround,也有称它们为“零长断言”。它们和前面的行的开始和结束差不多,不过不同的是

它们实际中确实匹配了字符,但那又放弃匹配并且只返回结果:匹配或者不匹配,这也就是它们为什么叫做“断言”的

原因。

    regex(?=(regex))正前向断言,regex(?!(regex))负前向断言。

    (?<=(regex))regex正后向断言,(?<!(regex))regex负后向断言。

它们匹配时是将当前所要匹配的字符串中的指针临时前移(后移)相应个位置,匹配完了指针又会返回原来的位置

   

连续匹配(\G):

    看不懂有什么用

条件:

    在正则表达式中的条件语句:if-then-else

    有一个专门的结构(?ifthen|else)允许你创建条件正则表达式。如果if的部分为真,那么引擎会试图匹配then的部分,要不然就是else部分。该语法包含

一对圆括号。左括号后面要跟上一个?,接后就是if部分,再接后就是then部分,最后可能要跟上|和else部分,当然你也可省略掉那个|和else。

    处在if部分,你能够使用前言和向后断言结构。使用正向前言,对应的语法就变成(?(?=regex)then|else)。因为前言有它自己的圆括号,那个if和then

的部分就分得很清楚。

    得记住那个向后断言结构不占用任何字符。如果你用一个前言作为if部分,那么引擎就会尝试在那个尝试if的相同位置匹配后面的then或者else部分(取决

于前言的结果)。

   

    还有可以用后向引用。比如(a)?b(?(1)c|d)这个就可以用来匹配abc或者bd。

    另外的形式:(?if(then1|then2|then3)|(else1|else2|else3))

   

注释:

    语法:(?#comment)

此条目发表在 phpoo 分类目录,贴了 , 标签。将固定链接加入收藏夹。

phpoo之正则表达式篇<<天行键学习笔记>>》有 3 条评论

  1. 小黑 说:

    终于明白了回溯是什么东西了~ 呵呵~

  2. 匿名 说:

    这种资料确实少见,天行键,很耳熟!

  3. Pingback 引用通告: 韩国首饰配件品牌

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>