首页 > 代码库 > 面包屑之正则表达式

面包屑之正则表达式

近来有在读《精通正则表达式》,就记录下自己的一些收获吧。

 

首先讲讲正则中的元字符,以及他们的优先级。

运算符

说明

\

转义符

(), (?:), (?=), []

括号和中括号

*, +, ?, {n}, {n,}, {n,m}

限定符

^, $, /任何元字符、任何字符

定位点和序列

|

替换

 

 

简单讲讲常用的一些元字符吧。

1,字符组("[]")

  

  字符组在正则中表示的是 既定范围内中的单个字符

  在字符组的内部,元字符的定义规则(及它们的意义)是不一样的。例如:

     ^ 在字符组中就代表是 非 的意思;   [^abc] 表示的意思是 除 a,b,c 以外的任意单个字符。而在外部则代表的是匹配字符串的头部。

    - 在字符组中就是连字符    [0-9] 表示的意思就是 0到9中的任意单个字符。 在外部只能匹配 "-"这个字符。

  

  不要混淆多选项和字符组。  字符组 [abc] 和多选项 (a|b|c) 固然表示的是一个意思。但它们有明显的不同,字符组只能匹配单个字符,多选项则不同,它可以匹配任意

长度的文本。每个多选项可能匹配的文本都是独立的,例如 (10,000,000|milloon|abcdajoie)。多选项没有字符组的排除功能。(多选项是顺序匹配的,多余的选择会用来回溯

 

2,量词("?,+,*,{}")

  代表的是匹配的次数。  ?----->  0或1次 

             * ----->  0或n次 

             + ----->  1或n次 

 

 

3,环视("(?=......) (?!......) (?<=......(?<!......)")  匹配的是一个位置。(有些只支持固定文本  即不带任何量词的正则)

  

  顺序环视相当于在当前位置右侧附加一个条件,而逆序环视相当于在当前位置左侧附加一个条件。

表达式

说明

(?<=Expression)

逆序肯定环视,表示所在位置左侧能够匹配Expression

(?<!Expression)

逆序否定环视,表示所在位置左侧不能匹配Expression

(?=Expression)

顺序肯定环视,表示所在位置右侧能够匹配Expression

(?!Expression)

顺序否定环视,表示所在位置右侧不能匹配Expression

 对于环视的叫法,有的文档里叫预搜索,有的叫什么什么断言的,这里使用了更多人容易接受的《精通正则表达式》中“环视”的叫法.

 

源字符串:aa<p>one</p>bb<div>two</div>cc

正则表达式:<(?!/?p\b)[^>]+>

这个正则的意义就是匹配除<p…>或</p>之外的其余标签。

 

(?!/?p\b)  ----->匹配左侧不能为   "p"  或者 "/p"  (/b代表的单词分界);

 

说到匹配位置,就不能不说  ^ $ \b ,  ^-----> 文本首部

                  $-----> 文本尾部 

                  \b-----> 单词分界  ("\<" "\>" 也是单词分界,分别代表的是左分界,右分界

                  

4,捕获型括号和非捕获型货号  "(),(?:)" ; (非捕获括号又叫仅用于分组型括号)

  顾名思义   一个会被捕获,一个不会被捕获。捕获主要用来 替换文本,和反向引用。

 

5, 固化分组  (?>......) 和 占有优先  量词添加一个"+"  例:  "?+"

   

  这两者会取消回溯。

  固化分组:   捕获文本后,不会回溯,即不会将已匹配的文本交出来。

 

6, 匹配优先,忽略优先

  普通的量词  都是匹配优先的。  如: ?,* ,+ ,{}

  忽略优先  则应该对应为   ??,*?,+?,{}?

  占有优先 则为 ?+,*+,++,{}+;

  无论 忽略优先还是匹配优先 都会以 匹配成功为最大优先级,都会产生回溯

  占有优先则不然,他是一个剑客,宁愿匹配失败也不会产生回溯

  

7, 回溯

  上文都有提到这个概念,其实就是一个面包屑的概念。

  多选项,字符组,量词 都会引起回溯。

 

8,引擎类别。

  NFA:(非确定型有穷自动机)   表达式主导,灵活性高,对程序员要求高。

  DFA:(确定性有穷自动机)  文本主导,没有回溯。

  

  各种语言支持的引擎:

  技术分享

 

ps:回首一看,好像只是记录了一些基本理论,可能是刚开始写博客,有点生疏,权当自己学习路的一个记忆点吧。另希望自己能慢慢进步。

 

面包屑之正则表达式