Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >正则表达式-分隔符示例

正则表达式-分隔符示例

作者头像
Dylan Liu
发布于 2019-07-01 04:40:45
发布于 2019-07-01 04:40:45
3K0
举报
文章被收录于专栏:dylanliudylanliu

说明

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

我们以""来作示例

一 凭直觉

可以简单写为"[^"]*" 对于处理"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:多写注释,后面自己都忘了当时为什么要写这么复杂了,其实写完再看四或六中的表达式对于当时是怎么思考的已经忘的差不多了,但是文档却会让我们的思考变得有迹可循。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
正则表达式-基本概念与简单元字符
首先,正则表达式是一个字符串组成的模式,用来匹配一个字符串,一般用在检索,替换里,也经常用来校验一些字符模式,检验是否匹配一个给定的规则。
Dylan Liu
2019/07/01
7460
精通正则表达式 - 打造高效正则表达式
        总的来说,提高正则表达式效率的关键在于彻底理解回溯背后的过程,掌握技巧来避免可能的回溯。
用户1148526
2023/10/14
8660
精通正则表达式 - 打造高效正则表达式
正则表达式-引擎
现在基本所有的文字编辑软件都会包含正则表达式的功能,但是不同的编辑器所使用的引擎实现原理是不一样的,现在大家用的有三种引擎:
Dylan Liu
2019/07/01
8990
正则表达式-引擎
Perl正则表达式详解[通俗易懂]
这里之所以加一个g修饰符是因为perl在进行全局匹配时,会记住匹配的位置,以便下一次继续从匹配的位置继续往下匹配。 为了清晰的查看它的运行原理,可以配合pos函数来获取当前文本匹配的位置。
全栈程序员站长
2022/09/04
8740
Perl正则表达式超详细教程
想必学习perl的人,对基础正则表达式都已经熟悉,所以学习perl正则会很轻松。这里我不打算解释基础正则的内容,而是直接介绍基础正则中不具备的但perl支持的功能。关于基础正则表达式的内容,可参阅基础正则表达式。
全栈程序员站长
2022/08/23
6.3K0
Perl正则表达式超详细教程
正则表达式优化
DFA (Deterministic Finite Automaton 确定有穷自动机): 常见的只有MySQL,文本主导,不支持反向引用和捕获括号,但快
林万程
2019/08/05
1.2K0
正则表达式-锚点及模式修饰符
本节已经把常用的元字符全部都罗列完了,Unicode相关的控制\p等没有列出,平常用不太多,把这些融汇贯通基本就可以解决90%的正则问题了。接下来我们来探讨一下正则引擎的原理,有助于我们写出正确、效率高的正则表达式。
Dylan Liu
2019/07/01
1.3K0
精通正则表达式 - 正则表达式实用技巧
        希望匹配连续多行文本,常见的情况是,一个逻辑行(logical line)可以分为许多现实的行,每一行以反斜杠结尾。
用户1148526
2023/10/14
9640
vim 正则表达式
毋庸多言,在vim中正则表达式得到了十分广泛的应用。 最常用的 / 和 :s 命令中,正则表达式都是不可或缺的。 下面对vim中的正则表达式的一些难点进行说明。
Dylan Liu
2019/07/01
1.5K0
正则表达式高级
正则表达式高级 ——《精通正则表达式》 +Java/Go/Python官方文档 +多年经验 +实验结果 知识整理
林万程
2019/08/05
1.1K0
正则表达式之量词
我们通常可以通过正则的一些规则匹配到所需的数据,例如[0-9]或\d来匹配单个数字字符等。
chimchim
2023/10/17
2240
正则表达式 引擎分类
DFA是文本主导,DFA引擎在扫描字符串时,会记录“当前有效”的所有匹配可能,因此目标文本中的每个字符最多只会检查一遍。
luoheng
2022/08/28
3460
刨根究底正则表达式之二——正则表达式基础
虽然本系列文章开篇会简单介绍正则表达式的一些基础知识,但主要限于本系列文章所想强调的要点,因此本系列文章并不适合用于入门。
笨笨阿林
2019/01/18
1.2K0
深入正则表达式(3):正则表达式工作引擎流程分析与原理释义
作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。
周陆军
2020/06/06
1.9K0
基础 | 正则表达式(JS)-入门篇2
继续讲下一般人(这里的一般人指的是一般不写正则的人)不经常用的功能: 1、忽略优先量词 包括:*?、+?、??、{num, num}? 。这几类和后面没有加?的量词的区别就是:前者会匹配尽可能少的内容
用户1097444
2022/06/29
2760
基础 | 正则表达式(JS)-入门篇2
正则表达式 : 检索匹配的利器
淡定
2017/08/29
1.7K0
正则表达式 量词、条件结构
量词是正则表达式的灵魂,也是正则表达式具有强大的文本处理能力的核心原因。常见的量词包括:
luoheng
2022/08/28
5440
C++ 与正则表达式
正则表达式可以说是软件开发中最常用的功能之一。本文将以C++语言为例,介绍其中的正则表达式相关知识。
C语言与CPP编程
2021/10/09
2.8K0
正则表达式与优化
用 NFA 自动机实现的比较复杂的正则表达式,在匹配过程中经常会引起回溯问题。大量的回溯会长时间地占用 CPU,从而带来系统性能开销。
WindCoder
2020/01/21
8500
正则表达式性能优化
正则表达式是计算科学的一个概念,很多语言都实现了他,正则表达式使用一些特定的元字符来检索,匹配以及替换符合规则的字符串。
小土豆Yuki
2020/11/03
2.2K0
相关推荐
正则表达式-基本概念与简单元字符
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档