我是靠谱客的博主 积极台灯,这篇文章主要介绍正则表达式的高级功能:前向与后向断言1 前言2 简介3 小结参考文献,现在分享给大家,希望可以做个参考。

文章目录

  • 1 前言
  • 2 简介
    • 2.1 正向断言(look ahead assert)
      • 2.1.1 正向肯定断言 (?=pattern)
      • 2.1.2 正向否定断言 (?!pattern)
    • 2.2 反向肯定断言(look behind assert)
    • 2.2.1 反向肯定断言 (?<=pattern)
      • 2.2.2 反向否定断言 (?<!pattern)
  • 3 小结
  • 参考文献

1 前言

正则表达式的基本功能能够满足大部分情况下的需求,但是有一些需求在满足时比较困难。举例来说,有以下文章(选自《新概念英语第3册》第14课:

After her husband Mr. Richards has gone to work, Mrs. Richards sent
her children to school and went upstairs to her bedroom. She was too
excited to do any housework that morning, for in the evening she would
be going to a fancy-dress party with her husband. She intended to
dress up as a ghost and as she had made her costume the night before,
she was impatient to try it on. Though the costume consisted only of a
sheet, it was very effective. After putting it on, Mrs. Richards went
downstairs. She wanted to find out whether it would be confortable to
wear.

现在的要求是选中所有的句号,即.号。如果使用 .来匹配,我们就会发现 Mr.Mrs. 都会被选中。只想选中句末的点号,那么会发现基本功能满足不了需求。所以,本文介绍一种正则表达式的高级功能:向前或向后断言功能。

2 简介

在以上的问题中,实际上就是对以 . 为结尾的字符串进行断言,如果是以 MrMrs 开头的 . 号则不选择。这种方式实际就称之反向选择(look behind),对应的有 (look ahead) 两种方式,那么就这两种方式分别进行介绍。

2.1 正向断言(look ahead assert)

正向断言分为正向肯定断言(look ahead positive assert)和正向否定断言(look ahead negtive assert)。

2.1.1 正向肯定断言 (?=pattern)

正向肯定断言(look ahead positive assert)的格式为 (?=pattern),匹配 pattern 的字符串开始处匹配查找字符串。该匹配不需要获取供以后使用。例如,Windows(?=95|98|NT|2000) 能匹配 Windows2000 中的 Windows,但不能匹配 Windows3.1 中的 Windows`。断言不消耗字符,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含断言字符之后开始。

让我们先看这样的一个示例,从上面的文本中选择以 t 结尾的单词,正则模式为 bw+tb,效果如下所示。
在这里插入图片描述
现在我们提出这样的需求,只筛选长度为2和3的单词,正则模式为 (?=(w{2,3})t)bw+tb,这样我们就可以得到以下的筛选结果。
在这里插入图片描述

2.1.2 正向否定断言 (?!pattern)

类似的,我们可以有正向否定断言 (look ahead negtive asset),即不满足指定断言的匹配,语法为 (?!pattern)。对于上面的示例,我们使用以下正则模式 (?=(w{2,3})t)bw+tb,可以得到以下结果。
在这里插入图片描述
显然,结果是对正向肯定断言的结果集合的否定结果集。

2.2 反向肯定断言(look behind assert)

与正面断言对应,正则表达式还定义了反向断言,分为反向肯定断言(look ahead positive assert)和反向否定断言(look ahead negtive assert)。

2.2.1 反向肯定断言 (?<=pattern)

反向肯定断言(look behind possitive asset)是向后进行判断的,语法格式为 (?<=pattern)。让我们来看看本文开头提出的问题,即若有 MrMrs 开头的 . 号如何判断。使用 .(?<=(Mr|Mrs).) 进行反向肯定断言后,可以匹配到所有 MrMrs 开头的 . 号,如下图所示。
在这里插入图片描述

2.2.2 反向否定断言 (?<!pattern)

通过上面的示例,让我们看看最终解决问题的方案,即使用反向否定断言(look behind negtive asset),语法格式为 (?<!pattern)。编写正则模式 .(?<!(Mr|Mrs).),则可以得到最终的结果,如下所示。
在这里插入图片描述
如图所示,我们截取到了所有不包括 MrMrs 这样编写的点号。

3 小结

本文介绍了一种更加强大正则表达式的语法,能够对匹配目标的前后进行条件断言,从而实现更加强大的断言匹配功能。通过这些语法的使用,我们可以实现更加强大的匹配功能。
最后,再补充两种带有问号的表达式,可以进一步提高匹配功能,有兴趣的读者可以进一步研究。

  • (pattern)
    匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。
  • (?:pattern)
    匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如 industr(?:y|ies) 就是一个比 industry|industries 更简略的表达式。

参考文献

[1] 正则表达式在线测试工具:http://tools.haokh.net/Regex
[2] Runoob.com 正则表达式 - 元字符 https://www.runoob.com/regexp/regexp-metachar.html
[3] 正则表达式在线生成工具, http://tools.jb51.net/regex/create_reg

最后

以上就是积极台灯最近收集整理的关于正则表达式的高级功能:前向与后向断言1 前言2 简介3 小结参考文献的全部内容,更多相关正则表达式的高级功能:前向与后向断言1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部