字符:
实际字符,
特殊字符(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)
终于明白了回溯是什么东西了~ 呵呵~
这种资料确实少见,天行键,很耳熟!
Pingback 引用通告: 韩国首饰配件品牌