`

正则表达式中的LookAround

 
阅读更多

这个东东有人把他直译为环视,到也还算贴切。因为本来这东西就分为head和behind两种类型。

分别表示找前面的和找后面的部分。然后又根据是想匹配括号里的内容还是不想匹配括号里的内容,分为了Positive和Negative两种。这样你就会发现目前已经分别在两个维度上有了分别两种分法,于是这就组合出了LookAround的全部四种情况:

  • Positive Lookahead
  • Negative Lookahead
  • Positive Lookbehind
  • Negative Lookhehind

看了上面说的东西,我自己都觉得晦涩,还是得上例子。

假设我一个文件,里面有N多的abc-123-efg这种形式的字符串,如果我想取出这种形式的字符串中的数字怎么办?(就是上面例子中的123).

一种最直观的想法是使用分组,也是正则中比较常用的手段,比如下面的perl code(如果你希望运行下面的code请确保你的PATH中有perl)

perl -e ' "abc-123-efg" =~ /\w+-(\d+)-\w+/; print "Total matched : $& and group 1 is : $1\n"; '
##########print on the console###########
# Total matched : abc-123-efg and group 1 is : 123

 从上面的语句和运行结果看,我们可以拿到123,但是显然123是分组1的匹配,并不是整个pattern的匹配,整个pattern的匹配是整个这个字符串本身。也就是说上面数字的截取是通过正则的分组机制绕了个弯执行的。

这有啥不好的?其实这也没啥不好,管他黑猫白猫,能抓耗子就是好猫。不过有时你可能会遇到一些场景希望一次性的把你需要的匹配直接反应到匹配结果上,比如:你用某些文本编辑器打开了上面的文件,像利用文本编辑器提供的正则表达式的地方,把上面的123这种数字一下子全匹配到,通常这之后编辑器一般也会给你高亮显示匹配的结果。

总之,类似于这样的场景下,LookAround就有登场的必要了。

下面的例子使用了Positive的lookbehind和lookahead:

perl -e ' "abc-123-efg" =~ /(?<=\w{3}-)\d+(?=-\w+)/; print "Total matched : $& and group 1 is : $1\n"; '
##########print on the console############
# Total matched : 123 and group 1 is :

 请注意以上pattern和上一个例子的比较,\d+已经不在分组中,取而代之的是他前面使用了一个positive lookbehind,后面使用了一个positive lookahead。从这个例子中你应该可以体会到,positive其实是需要匹配,但是匹配了之后并不将这个匹配放入最后的匹配结果,而是将这部分之后(look behind)或者之前(look ahead)的部分放入匹配结果。

如果你足够细心的话,会发现上面的look behind和look ahead中pattern的量词不一样,一个是固定数量的3,一个是不限定数量的+,这里其实并不是因为我们业务上数字前面的字符串的长度一定是3,而是因为我本机perl 5.12的测试结果显示perl5.12还不支持在lookbehind中使用使用不定长度的量词,如果写成和lookahead一样的话,会得到下面的错误:

Variable length lookbehind not implemented in regex m/(?<=\w+-)\d+(?=-\w+)/ at -e line 1.

 好了,上面举了一个简单的positive lookbehind和lookahead的例子,还剩下两个negative lookhebind和lookahead的没说,这个跟positive最大的区别,相信你从名字上也能猜出个一二了,就是不匹配那块的东西。艾,说起来也真拗口。具体的还是看人家老外写的例子吧,这篇文章写的非常详细,值得细读。

分享到:
评论

相关推荐

    源码(精通正则表达式&实战正则表达式)

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于匹配、查找、替换或提取字符串中的特定模式。本资源“源码(精通正则表达式&实战正则表达式)”专注于JavaScript环境下的正则...

    正则表达式入门教程(pdf版

    正则表达式是一种特殊的文本模式,用于在字符串中查找和匹配符合特定规则的子串。它是文本处理不可或缺的工具之一,广泛应用于编程语言、文本编辑器、搜索引擎以及各种编程和脚本语言中。正则表达式的能力远超简单的...

    精通正则表达式(第三版)简体中文.pdf

    4. **高级特性**:如lookaround(前瞻后顾)、条件表达式、嵌套结构等,这些都是正则表达式进阶使用的必备知识,能实现更精细的匹配控制。 5. **正则表达式引擎的差异**:书中讨论了不同的正则表达式引擎(如Perl、...

    精通正则表达式(第3版)中英文

    书中还深入讨论了正则表达式的高级特性,如后行断言(lookaround)、条件表达式、嵌套重复和递归,这些都是处理复杂文本模式的关键工具。此外,Friedl还探讨了在实际项目中如何优化正则表达式,避免性能问题,并提供...

    正则表达式 电子书 教程 chm

    正则表达式是一种强大的文本处理工具,用于在字符串中匹配、查找、替换或提取特定模式。它是编程语言中不可或缺的一部分,适用于数据验证、文本搜索和替换等任务。本教程是专为初学者设计的,旨在提供一个简单易懂的...

    正则表达试编辑器,编写正则表达式

    在正则表达式编辑器中,用户可以方便地构建正则表达式模式,并立即在实际文本上进行测试,以验证其正确性和有效性。编辑器通常会提供以下功能: 1. **模式构建**:提供友好的界面,让用户可以直观地创建正则表达式...

    正则表达式检查小工具

    在编程语言中,如Java,正则表达式是通过特定的API来使用的,例如Java的`java.util.regex`包。本工具“正则表达式检查小工具”旨在帮助开发者快速验证自定义的正则表达式是否能够正确匹配目标字符串,从而提高开发...

    正则表达式系统教程非常好的学习资料

    在这个“正则表达式系统教程”中,我们可以深入理解正则表达式的概念和用法。 1. **基本概念** - **字符类**: 包括各种基本字符,如[a-z]代表小写字母,[0-9]代表数字,.代表任意字符。 - **量词**: 如*、+、?和{...

    .NET正则表达式(网页版)

    正则表达式(Regular Expression)在编程领域中广泛用于数据验证、搜索与替换等场景,尤其是在处理复杂字符串操作时显得尤为高效。 正则表达式是一种模式匹配语言,可以用来描述一系列的字符组合。在.NET框架中,C#...

    30分钟学会正则表达式

    在本教程中,我们将分为三个部分,逐步深入理解和掌握正则表达式。 **第一部分:基础概念** 1. **元字符(Meta-character)**:正则表达式中的元字符具有特殊含义,如`.`匹配任意单个字符,`^`表示行首,`$`表示行...

    精通正则表达式英文版

    本书的第三版(3rd.Edition)涵盖了正则表达式的最新发展,包括Unicode支持、预查(lookaround)以及更多的高级特性。作者 Jeffrey E.F. Friedl 用通俗易懂的语言和丰富的实例,引导读者逐步掌握正则表达式的精髓。 ...

    余晟_实战正则表达式

    实战正则表达式第2讲可能涵盖了更复杂的正则表达式构造,如环视(lookaround)——前瞻断言(lookahead)和后顾断言(lookbehind),以及更高级的用法,如使用条件语句和非捕获组等。这些高级特性能够使正则表达式...

    深入浅出之正则表达式

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换。它在编程语言中广泛应用,包括C#。这篇文档“深入浅出之正则表达式”将引领我们逐步理解这一复杂的概念。 1. **正则表达式基础** - ...

    正则表达式测试工具 regextester

    { [ ] \ | ( )`,它们在正则表达式中具有特殊含义。 - 字符类:如`[abc]`,表示匹配任何在方括号内的字符。 - 量词:如`*`、`+`、`?`,分别表示零或多个、一个或多个、零个或一个前面的字符或字符集。 - 转义...

    正则表达式傻瓜式宝典

    6. **高级用法**:包括零宽度断言(如前瞻断言和后顾断言)、条件表达式、环视(lookaround)等复杂技巧,这些高级特性使得正则表达式可以进行更精确的匹配。 7. **实战应用**:书中可能会提供大量的实例,如邮箱...

    正则表达式自学完全手册

    此外,正则表达式还涉及到一些高级技巧,如lookaround(前瞻后顾)和条件表达式,它们可以实现更复杂的匹配逻辑。例如,(?=...)可以匹配紧随其后的模式,而(?!...)则匹配后面不跟指定模式的位置。 《正则表达式自学...

    正则表达式教程(chm格式)

    正则表达式在编程语言中的应用广泛,如JavaScript、Python、Java等都内置了正则表达式支持。它们常用于验证用户输入(如邮箱、电话号码格式),数据提取(从网页抓取信息),文本替换(批量修改文档)等。 八、调试...

    正则表达式各种资料搜集

    在"正则表达式各种资料搜集"的压缩包中,我们可以期待找到一系列关于正则表达式的资源,包括教程、示例、练习和可能的解析库,这些都是深入学习和熟练掌握正则表达式的关键。 1. **基础概念**:正则表达式由元字符...

    正则表达式

    - C#中的正则表达式支持`lookaround`,如`(?)`和`(?&lt;!...)`,以及`平衡组`(平衡括号)。 6. **学习资源**: - 提供的文档"javascript正则表达式.doc"和"一些正则表达式的含义.doc"可以深入理解正则表达式的具体...

    达内JAVA的正则表达式

    Java中的正则表达式是处理字符串的强大工具,它允许我们以一种简洁的方式匹配、查找、替换和解析文本。正则表达式(Regular Expression)在Java编程语言中通过`java.util.regex`包提供支持。这个包包含三个核心类:`...

Global site tag (gtag.js) - Google Analytics