专栏首页dylanliu正则表达式-分隔符示例

正则表达式-分隔符示例

说明

文本中经常需要匹配分隔符内的内容,像程序中的注释以/*开头,*/结尾;双引号""内的字符等,我们今天以这个例子来一步步的构建这个正则表达式

我们以""来作示例

一 凭直觉

可以简单写为"[^"]*" 对于处理"haha haha"这种的足够了, 不过如果有转义斜线\怎么处理?就是对于"\"This is Tom\" he said",我们只会先匹配到\,但在语义上与我们要匹配的不符合

二 环视

可以采用环视,\"认为是正常文本,这样表达式写为"([^"]|(?=\\)")*"

三 转义字符

对于上面的表达式,我们如果匹配 "hello there \\" else "hello world" 按上面例子匹配到else后的",问题是\是被转义的,匹配到这里是不对的。 考虑到\\是成对出现的,\后面的字符都是被转义的,具体是什么其实无所谓, 我们可以以反斜线后面跟一个点号来匹配这样的内容,写为"(\\.|[^"])*"

四 不匹配的字符串

我们再来构造一个不应该匹配的串: "hello there \2\3" and world 按照三种的正则式会匹配出来hello there \2\3\, 在\\.匹配后,到最后没有找到后面的",所以会回溯到\"\匹配[^"], "匹配最后的" 从这我们看到在后面中括号里面也不应该包括反斜线,把它去掉,改写为:"((\\.)|[^\\"])*"

五 效率问题

这个式子就可以了,不过效率不够好,因为反斜线转义的字符在前面,但是普通字符出现的频率比反斜线转义的字符要高,引擎在传动之后发现不匹配就需要回溯,造成了很多的浪费,我们来换一下位置变为:"([^\\"]|(\\.))*"

六 占有优先量词和固化分组

如果我们使用占有优先量词和固化分组更好一点,这样在三中出现的问题就没有问题了,因为占有优先量词在回溯时不会交还字符,而是直接报错. "(\\.|[^"])*+" \\.匹配的字符不会交还,就不会出问题 "((?>\\.)|[^"])*""(?>(\\.|[^"])*)" 这两种应该都可以

七 总结

总结两点 1:要深刻理解回溯,多选结构匹配出来的结构可能并不是我们想要的。 2:多写注释,后面自己都忘了当时为什么要写这么复杂了,其实写完再看四或六中的表达式对于当时是怎么思考的已经忘的差不多了,但是文档却会让我们的思考变得有迹可循。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 正则表达式-基本概念与简单元字符

    首先,正则表达式是一个字符串组成的模式,用来匹配一个字符串,一般用在检索,替换里,也经常用来校验一些字符模式,检验是否匹配一个给定的规则。

    Dylan Liu
  • 正则表达式-锚点及模式修饰符

    本节已经把常用的元字符全部都罗列完了,Unicode相关的控制\p等没有列出,平常用不太多,把这些融汇贯通基本就可以解决90%的正则问题了。接下来我们来探讨一下...

    Dylan Liu
  • 正则表达式-引擎

    现在基本所有的文字编辑软件都会包含正则表达式的功能,但是不同的编辑器所使用的引擎实现原理是不一样的,现在大家用的有三种引擎:

    Dylan Liu
  • 正则表达式

    https://blog.csdn.net/CSDN___LYY/article/details/53104136

    匠心Java
  • 正则表达式详解

    点号(.)是元字符,匹配除换行符以外的任意字符。 星号(*)是元字符,代表数量。 点号星号连在一起就是匹配任意数量的不包括换行符的字符。 \s匹配任意空白字符。...

    wangxl
  • 正则表达式-2.重复匹配

    在上面例子中,第一个<B>和最后一个</B>中间的内容被/.*/全部匹配出来了。这就是“贪婪型”的元字符。 要想分别匹配两个B标签中中间的内容,需要使用“懒惰...

    悠扬前奏
  • 网络安全自学篇-PHP代码审计(二)

    一、最左原则(非贪婪模式):正则表达式总是从目标字符串的最左侧开始,依次匹配,直到匹配到符合表达式要求的部分,或直到匹配目标字符串的结束 二、最长原则(贪婪模式...

    字节脉搏实验室
  • 正则表达式

    例如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。

    羊羽shine
  • 【打卡贴】(No.010) 正则表达式匹配

    给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。

    PM小王
  • 简易数据分析 17 | Web Scraper 高级用法——利用正则表达式筛选文本信息

    学习了这么多课,我想大家已经发现了,web scraper 主要是用来爬取文本信息的。

    卤代烃

扫码关注云+社区

领取腾讯云代金券