加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 学习笔记

发布时间:2020-12-13 19:47:52 所属栏目:百科 来源:网络整理
导读:工作机制 文本导向(text-directed) - DFA引擎 正则导向(regex-directed) - NFA引擎 “惰性”量词(lazy quantifiers)和反向引用(backreferences),只能在正则导向的引擎中实现。如果反向引用或“惰性”量词被实现,则可以肯定你使用的引擎是正则导向的。你可

工作机制

  • 文本导向(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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读