正则表达式 学习笔记

工作机制

  • 文本导向(text-directed) - DFA引擎
  • 正则导向(regex-directed) - NFA引擎

“惰性”量词(lazy quantifiers)和反向引用(backreferences),只能在正则导向的引擎中实现。如果反向引用或“惰性”量词被实现,则可以肯定你使用的引擎是正则导向的。你可以作如下测试:将正则表达式<<regex|regex not>>应用到字符串“regex not”。如果匹配的结果是regex,则引擎是正则导向的。如果结果是regex not,则是文本导向的。因为正则导向的引擎是“猴急”的,它会很急切的进行表功,报告它找到的第一个匹配。
正则导向的引擎总是返回最左边的匹配

匹配原理

  • 占用字符:如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;
  • 零宽度:如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。

占有字符是互斥的,零宽度是非互斥的。也就是一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。

元字符

所有的元字符:
[ ] \ ^ $ . | ? * + ( )

1. 字符组

字符集是由一对方括号“[ ]”括起来的字符集合

  • 在左方括号“[”后面紧跟一个尖括号 “ ^ ” ,将会对字符集取反
  • 字符集中的元字符: ] \ ^ -

2. 小数点

.  匹配除了换行符 \n 以外的任意一个字符

3. 量词

{m}   匹配m次
{m,n} 匹配最少m次,最多n次
{m,}  匹配至少m次
?  匹配前导字符0次或一次。相当于{0,1}
+  匹配前导字符1次或多次。相当于{1,}
*  匹配前导字符0次或多次。相当于{0,1}

匹配优先(贪婪模式):标准量词修饰的子表达式,在可匹配可不匹配的情况下,总会先尝试
进行匹配。“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配优先的。

忽略优先(非贪婪模式):标准量词后加一个“?”,此时,在可匹配可不匹配的情况下,总会先忽略匹配。“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

  • 举例:

        源字符串:<div>aaa</div><div>bbb</div>
        正则表达式1:<div>.*</div>      匹配结果:<div>aaa</div><div>bbb</div>
        正则表达式2:<div>.*?</div>     匹配结果:<div>aaa</div>
    

4. 分支

|  表示选择。你可以用选择符匹配多个可能的正则表达式中的一个。

捕获组和环视

捕获组匹配的内容,可以在正则表达式的外部程序中进行引用,也可以在表达式中进行引用,表达式中引用的方式就是反向引用。

(Expression) 普通捕获组
(?<name> Expression) 命名捕获组
(?:Expression) 非捕获组

环视只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的。
环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。环视相当于对所在位置加了一个附加条件。

(?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression
(?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression
(?=Expression)  顺序肯定环视,表示所在位置右侧能够匹配Expression
(?!Expression)  顺序否定环视,表示所在位置右侧不能匹配Expression

你可能感兴趣的:(正则表达式,学习,笔记)