《精通正则表达式》笔记 --- 选择引号内的文字
这个例子出自《精通正则表达式》,做一下笔记帮助理解和记忆。
第一版
最简单的case就是考虑包含一对引号,那么写出来的表达式应该是这样的:
".*"
但是这个未免太简单了吧,会有啥问题呢?假如输入的字符串长这样结果就会出问题拉。see...
Input String: "Hello" and "World"
Regex: ".*"
Match: "Hello" and "World"
为什么会全部匹配到呢?这是因为 * 是一个greedy(匹配优先)的量词,我觉得英文的意思更容易帮助我们理解。这意味着它会首先会'贪婪'得把所有的字符匹配完,匹配到最后一个字符发现没有字符可以匹配了,于是开始匹配下一个引号,它会首先回朔到最后一个引号前,然后开始匹配引号匹配引号,发现可以匹配,然后就完成了。这就是为啥整个字符串都被匹配了。
第二版
既然是因为greedy的量词导致的这个问题,那我们将其给成lazy(忽略优先)的量词 ----- *? 。当一个量词是忽略优先的话,那在匹配的时候,引擎会选择忽略这个忽略优先量词修饰的字符去匹配下一个字符,如果匹配则继续,如果不匹配则返回来匹配这个忽略优先量词修饰的字符。
看一下这个例子,将表达式稍作修改,匹配结果就变鸟。
Input String: "Hello" and "World"
Regex: ".*?"
Match-1: "Hello"
Match-2: "World"
好了,似乎这个版本已经圆满完成我们的任务啦。
第三版
那我们将需求继续变化一下,在程序的世界里有一种东西叫做转移字符,比如有个字符串长这样子\"Hello, World!\"+\"
。 直接上最终正则表达式。
Input String: \"Hello, World!\"+\"
Regex: "(\\.|[^\\"])*"
Match-1: No Match
正则表达式中关键的是这个(\\.|[^\\"])
,这个括号在正则表达式里是起到一个多选结构的作用,表示匹配括号内任意一个子表达式即匹配。这个括号里面由两部分,第一部分是\\.
,第二部分是[^\\"]
。
\\.
\\.
能够匹配任何的转义字符,严格来说是匹配任意\以及其后面的字符,即使它们不是真正的转义字符。
[^\"]
这个输入字符串最后一个引号是转移的引号,所以这个正则表达式没有匹配到任何的结果。这个结果是对的,这个功劳就要归结到这个[^\\"]
,它的意思是匹配非\"的任意字符。当引擎匹配到字符串最后发现"
还未匹配,于是进行回溯,回溯到▴那个位置\"Hello, World!\"+ ▴ \"
。引擎会尝试去匹配[^\\"]
,发现匹配失败,于是失败!
假如我们将[^\\"]
换成[^"]
,那么在刚才那个位置的时候,[^"]
就会匹配\
字符,然后\
之后的"
会被外层的引号匹配,于是它的结果就是被匹配了。这显然是很奇怪的,当然如果你想要这么匹配也可以。
其他版本
还有一种方式是利用正则表达式里面的固化分组(Atomic grouping)或者占有优先量词(Possessive)。固化分组:"(?>(\\.|[^"])*)
,占有优先量词:"(\\.|[^"])*+"
。在固化分组或者占有优先量词的匹配过程中,在固化分组内或者占有优先量词修饰的组内,如果一个字符已经被匹配那么之前的状态将会被舍弃,就防止它进行回溯。
在这个例子中,\"Hello, World!\"+\"
,当匹配到这个位置的时候(\"Hello, World!\"+\" ▴
)发现没有办法继续匹配下去了,引擎会选择直接匹配失败,而不是回溯到之前的备用状态进行新的匹配。
关键的概念
例子虽然简单,但是出现了正则表达式中很多关键的概念,预知详情,请阅读《精通正则表达式》
- 匹配优先量词(Greedy quantifier)
- 忽略优先量词(Lazy quantifier)
- 占有优先量词(Possessive quantifier)
- 固化分组(Atomic grouping)
- 字符组(Character Classes)
- 多选结构(Alternation)
本文纯属个人读书笔记,如有错误概不负责哟~~~
转载于:https://www.cnblogs.com/imjustice/p/regex_select_text_in_quota.html
《精通正则表达式》笔记 --- 选择引号内的文字相关推荐
- 精通正则表达式笔记二---正则表达式基础概念?,+,*,{ },\,“ “,时间,小结
2 可选项元素 2.1 ? 现在来看color和colour的匹配.它们的区别在于,后面的单词比前面的多一个u,我们可以用colou?r来解决这个问题.元字符?(也就是问号)代表可选项.把它加在一个字 ...
- 精通正则表达式笔记一---正则表达式基础概念[ ],[^ ],.,^,$,\<,\>,|,(),-
学习过程中,可以到这篇文章推荐的网站进行正则表达式的练习.点击这里 正则表达式是一种思想--各种工具以各种方式来实现它.如果理解了正则表达式的基本思想,掌握就是易如反掌的事情. 弄明白"如何 ...
- 【读书笔记】精通正则表达式
到处逛博客想找正则优化的办法,发现挺多博客提高这本书,大同小异都是从<精通正则表达式>的第6章总结起来的,很有意义拜读一下. 第3版电子书资源都是从网络上下载过来的 非扫描版,排版不太好, ...
- 正则表达式(菜鸟教程+精通正则表达式)未完结
参考菜鸟教程和精通正则表达式一书,其中精通正则表达式里面的例子大多都是perl脚本的,工作中也用到perl脚本,还是能看懂的. 正则表达式在线生成工具:http://tools.jb51.net/re ...
- 《Shopify从入门到精通》笔记(4~6章)
目录 第4章 Shopify 后台功能 4.1 Shopify后台概览 第5章 Shopify设置 5.1 Shopify的基础设置 5.2 其他设置 第6章 网站优化 6.1 网站设计 6.2 关键 ...
- PHP正则表达式笔记与实例详解
链接:https://www.jb51.net/article/160947.htm 笔记: 一.正则表达式的介绍: 二. 语法: 三. 正则表达式的组成部分: 四. 正则表达式的函数: 实例: 1. ...
- 精通正则表达式(第3版)
<精通正则表达式(第3版)> 基本信息 作者: [美]Jeffrey E.F.Friedl 译者: 余晟 出版社:电子工业出版社 ISBN:9787121175015 上架时间:2012- ...
- 前端-Vue.js从入门到精通基础笔记(理论+实操+知识点速查)
#[2022.3]尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查) 前言 本文完全基于 参考资料:加工整理而成,包括其代码,案例,资源等.前置知识是学习尚硅谷的视频教程,本文配合其教程 ...
- JavaScript正则表达式笔记
正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. ''**************** ...
最新文章
- Docker下部署mysql
- 2018-3-14智能算法(文章--优化问题的智能算法及其哲学内涵)笔记一(什么是优化问题)
- 潘天佑博士2014微软学生夏令营演讲:如何培养领导力
- php 如何将字体转为gb,利用php怎么将utf-8与GB2312相互转换
- python调用第三方软件发信代码_【IT专家】python调用第三方邮件接口
- 最详细的使用 soapui 消费 SAP Cloud for Customer Web service 的教程
- matplotlib 设置水平线、垂直线
- apache2配置优化以及性能测试小结
- Centos 6让SVN提交文件自动更新到nginx的WEB目录
- FTP服务器上传文件操作方法,FTP工具(FLASHFXP)下载使用教程
- 数据挖掘学习之路一:数据挖掘认识
- 易辅客栈 从零学辅助_如何从零启动辅助项目
- 解决win10系统alt+tab切换程序不显示程序缩略图问题
- 王家林人工智能AI第九节课:AI的上帝视角:神经网络能够完成各种计算模式的根本原因及神经网络能够识别图片宇宙密码 老师微信13928463918
- SCAU高级语言程序设计OJ
- 聚观早报 | 苹果首款头显明年1月亮相;米哈游投资信托「打水漂」
- STM8L学习笔记-GPIO端口操作(一)
- sql查询语句,在表中的一个字段的部分数据中查看其他字段
- 好久不见,甚是想念!!!
- win10任务栏透明_Win10任务栏美化工具
热门文章
- html音乐静音代码,HTML Audio muted用法及代码示例
- java int a=b指向_java里int a=3,给a赋值的时候,是给它3的地址,还是直接赋值二进制3?...
- 回顾︱DeepAR 算法实现更精确的时间序列预测(二)
- GO语言学习之路19
- Linux下7z工具安装
- 学习hibernate(五) -- hibernate映射关系
- PHPCMS整合UCENTER后登陆问题
- SSL 中证书能否够使用IP而不是域名
- SQL Server 透视与逆透视转换解析
- png图片 透明区域如何 让其不响应鼠标事件?