精通正则表达式第三章:正则表达式的特性和流派概览
程序设计语言处理正则表达式的方式
- 集成式:表达式直接内建在语言之中,如Perl
- 程序式和面向对象式:正则表达式不属于语言的低级语法。相反,普通的函数接受普通的字符串,把他们作为正则表达式进行处理。
集成式处理
集成式处理方法减轻了程序员的负担,因为它隐藏了一些工作,例如正则表达式的预处理,准备匹配,应用正则表达式,返回结果。但是有时这样处理反而更慢,更复杂。
程序式处理和面向对象式处理
正则功能不是由内建的操作符来提供,而是由普通函数(函数式)或构造函数(面向对象式)来提供的。
Java中的正则处理
常用元字符和特性
字符组及相关结构
- 普通字符组:
[a-z]
和[^a-z]
,需要强调的是,元字符的规定在字符组内外饰有差别的。例如,字符组内部的*
永远都不是元字符,二-
通常都是元字符。有些元序列如\b
在字符组内外是不一样的。
字符组通常表示肯定断言。也就是说他们必须匹配一个字符。排除型字符组仍然需要匹配一个字符,只是她没有在字符组内列出而已。
几乎能匹配任何字符的元字符:点号
在某些工具软件中,点好被用来缩略表示可以匹配任何字符的字符组,而在其它工具中,点号匹配除了换行符之外的任何字符。
- 在Sun的Java regex package 之类的支持Unicode的系统中,点号不能匹配Unicode的行终结符。
- 匹配模式会改变点号的匹配规则。
- POSIX规定,点号不能匹配NUL(值为0的字符),尽管大多数脚本语言容许文本中出现NUL(而且可以用点号来匹配)。
点号还是排除型字符组
如果所使用的工具能够在多行文本中进行搜索,请务必注意点号,它通常情况下不能匹配换行符,而排除型字符组[^"]
通常都可以。如果把".*"
替换为"[^"]"
,可能会带来意想不到的效果。
单个字节
Perl和PCRE(也包括PHP)支持用\C
匹配单个字节,即使该字节位于某个多字节编码的字符之中(相反,其他功能都是基于字符的)。这个功能一定要在清楚自己的所作所为下才使用。
Unicode组合字符序列:\X
Perl和PHP支持使用\X
缩略表示\P{M}\p{M}*
,它可以视为点号的扩展,它匹配一个基本字符(除了\p{M}之外的任何字符),之后可能有任意数量的组合字符(出\p{M}之外)。
字符组简记法:\w , \d, \s, \W, \D, \S
\d
:数字,等价于[0-9]
,如果工具软件支持Unicode,能匹配所有的Unicode数字。
\D
:非数字字符 等价于[^\d]
。
\w
: 单词中的字符,=一般等价于[a-zA-Z0-9_]
,某些工具软件中\w
不能匹配下划线,而另一些工具软件中的\w
能支持当前locale中的所有数字和字符。如果支持Unicode,\w
通常能匹配所有数字和字符,而在java.util.regex和PCRE(包括PHP)中,\w
严格等价于[a-zA-Z0-9_]
。
\W
:非单词字符 等价于[^\w]
。
\s
:空白字符,在支持ASCII的系统中,它通常等价于\f\n\r\t\v
(第一个是空白字符)。有时包括Unicode的”换行“字符U+0085
,有时包含空白(whitespace)属性\p{M}
\S
:非空白字符, 等价于[^\s]
。
POSIX的locale设定会影响这些简记符号的含义(尤其是\w
)。支持Unicode的程序中,\w
通常能匹配更多的字符,例如\p{L}
和下划线。
Unicode属性,字母表和区块:\p{Prop}
、\P{Prop}
Unicode不仅仅是一套字符规则,他还定义了每个字符的性质,例如”这个字符是小写字母“,”这个字符是从右往左看的“,”这个字符是标记字符,他必须与其他字符一同使用“等等。
不同的正则表达式系统对这些属性的支持也不相同,但是许多支持Unicode的程序能够通过\p{quality}
和\P{quality}
支持其中的一部分。比如\p{L}
就是一个简单例子,这里'L'
的意思是”字母(letter)“(相对于数字number,标点qunctutation和口音accent,之类)。'L'
是一种普通属性(general property,也成为分类)。我们马上会了解到,可以用\p{...}
和\P{...}
来测试其他属性。
字母表:有的系统能够按照字母表(书写系统writing system)的名字以\p{...}
来匹配。例如\p{Hebrew}
匹配希伯来文独有的字符(但不包含其他书写系统中常见的字符,例如空格和标点)。
字母表不会包含特定书写系统中的所有字符,而只包含独属于(或者几乎独属于)此书写系统中的字符。常见的字符,如空格和标点不属于任何字母表,而是属于通用的IsCommon伪字母表(pseudo-script),用\p{IsCommon}
匹配。
区块:类似于字母表,区块表示Unicode字符映射中一定范围内的代码点。
简单的字符组减法
[[a-z]-[aeiou]]
就是匹配小写非元音字母
完整的字符组集合运算:[[a-z] && [^aeiou]]
OR
运算:用于将多个字符组合并
AND
对两个集合进行概念上的“与”运算,只保留同时属于两个字符组的字符。
POSIX“字符组”方括号表示法
我们通常所说的字符组,在POSIX标准中成为方括号表达式(bracket expression)。POSIX字符组是POSIX方括号表达式使用的几种特殊元字符序列之一。比如[:lower:]
表示当前locale中的所有小写字母。它还包含一些特殊的小写字母(在locale)中定义的。
POSIX“collating序列”方括号表示法:[[ span-ll ]]
Local可以包含对应的collating序列,用来决定其中的字符如何排序。
POSIX“字符等价类”方括号表示法:[[=n=]]
有的locale定义了字符等价类,表示某些字符在进行排序之类的操作时应视为等价。
锚点和其他零长度断言
这两个东西并不会匹配实际的文本,而是寻找文本中的位置。
行/字符串起始位置:^
、\A
如果可以使用,\A
总是匹配待搜索文本的起始位置。
行/字符串的结束位置:$
、\z
和\Z
如果支持,\Z
通常表示“未指定任何模式下”$
匹配的字符,通常是字符串末尾的位置,或者是在字符串末尾的换行符之前的位置。作为补充,\z
只匹配字符串的末尾,而不考虑任何换行符。
匹配的起始位置(或者是上一次匹配结束的位置):\G
\G
首次出现在Perl中。使用/g
的匹配中,\G
对迭代操作非常有用,它能够匹配上一次匹配结束的位置。在第一次迭代中,\G
匹配字符串的开头,与\A
一样。
分组,捕获,条件判断和控制
捕获/分组括号:(…)和 \1, \2, …
普通的无特殊意义的括号通常由两种功能:分组和捕获。普通括号常见的形式是(...)
,但有的流派中使用\(...\)
,例如FNU Emacs,sed,vi和grep。
仅用于分组的括号
仅用于分组的括号(?:...)
不能用来提取文本,而只能用来规定多选结构或者两次的作用对象。因此也被称为“非捕获型括号”。
命名捕获(?<Name>...)
Python和PHP的preg引擎,都能够为捕获内容命名。python和PHP使用的语法是(?P<name>...)
,而.NET使用(?<name>...)
。
\b(?<Area>\d\d\d)-(?<Exch>\d\d\d)-(?<Num>\d\d\d)\b
可以用对应的方法提取命名捕获的内容,如在VB和.NET语言中使用RegexObj.Groups(“Area”),在PHP中使用RegexObj.group(“Area”)。
固化分组:(?>...)
一旦括号内的子表达式匹配之后,匹配的内容就固定下来(固化(atomic)下来无法改变),在接下来的匹配过程中不会变化,除非整个固化分组的括号都被弃用,在外部回溯中重新应用。
表达式。.*!
能够匹配文本。Hola!
,但是表达式。(?>.*)!
却不能。因为使用了固化分组,在.*
在固化分组中,他永远不会“交还”已经匹配的任何内容。
固化分组有重要的用途。尤其是,能够提高匹配的效率,而且能够对什么匹配,什么不能匹配进行精确地控制。
多选结构
多选结构能够在同一位置测试多个子表达式。每个子表达式称为一个多选分支(alternative)。多选结构的优先级很低,所以this and|or that
的匹配等价于(this and)|(or that)
,而不是this (and|or) that
。
条件判断:(?if then | else)
可以根据已经匹配的结果选择下一步要用哪个子表达式进行匹配。下面的例子匹配<IMG> tag
,无论是单独出现的,或者是在<A>...</A>
中出现的。
(<A\s+[^>]+> \s* )? #匹配开头的<A> tag,如果存在的话
<IMG\s+[^>]+> #匹配<IMG> tag
(?(1)\s*</A>) #匹配结尾的</A>,如果之前匹配过<A>
(?(1)...)
测试中的(1)
会测试第一组捕获型括号是否参与了匹配。“参与匹配”不等于实际匹配了文本。
匹配优先量词:*, +, ?, {num,num}
要注意在某些工具中可能使用\+
和\?
来取代+
和?
。同样,在更老的某些工具中,量词不能限定反向引用,也不能限定括号。
区间:{min,max}
或者{min,max \}
区间可以被认为是“计数量词”
忽略优先量词:*?, +?, ??, {num,num}?
量词在正常的情况下都是匹配优先的,匹配尽可能多的内容。相反,这些忽略优先的量词会匹配尽可能少的内容,只需要满足下限,匹配就能成功。
占有优先量词:*+, ++, ?+, {num,num}+
这些量词目前只有java和PCRE提供(这本书比较老了,现在的情况不知道怎样),占有优先量词类似普通的匹配优先量词,不过他们一旦匹配内容,就不会“交还”。他们类似固化分组。
从某种意义上来说,占有优先量词只是些表面功夫,因为它们可以用固化分组模拟实现。
.++
与?>.+
的结果完全一样,只是足够智能的实现凡是能对占有优先量词进行更多优化。
精通正则表达式第三章:正则表达式的特性和流派概览相关推荐
- 第三章 正则表达式括号的作用
不管哪门语言中都有括号.正则表达式也是一门语言,而括号的存在使这门语言更为强大. 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准. 括号的作用,其实三言两语就能说明白,括号提供了分组, ...
- 简单入门正则表达式 - 第三章 快速入门
一.字面值字符 正则表达式的作用就是根据给定的字符样式,来匹配目标字符串.而这种匹配方案中,最简单的就是字面值字符的匹配. 那么,什么叫字面值字符匹配呢?简单的说,就是输入一个样式ABC,就能把目标字 ...
- 《Visual C# 从入门到精通》第三章使用判断语句——读书笔记
第3章 使用判断语句 3.1 使用布尔操作符 布尔操作符是求值为true或false的操作符. C#提供了几个非常有用的布尔操作符,其中最简单的是NOT(求反)操作符,它用感叹号(!)表示.!操作符求 ...
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——1 概述
说明:本系列文章介绍的算法均来自编译原理(龙书)一书,如果读者对代码没有兴趣,只想了解算法思路,完全可以阅读龙书相关章节内容,比我讲得清晰透彻. 序: 啃编译原理半年以来,任然徘徊在前4章,其间反反复 ...
- 《精通正则表达式(第三版)》下载
<精通正则表达式(第三版)> https://pan.baidu.com/s/1PsV0PDasWijZxfGHkrEebA
- python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)
第10章 正则表达式(重点)与JSON 初识正则表达式 元字符与普通字符 字符集 概括字符集 数量词 贪婪与非贪婪 匹配0次1次或者无限多次 边界匹配符(^ .$) 组 匹配模式参数 re.sub正则 ...
- Python爬虫学习笔记(三)——正则表达式
介绍 正则表达式是一种处理字符串的强大工具,能实现字符串的检索.替换.匹配验证等.在爬虫中,正则表达式主要用于从HTML里提取所需要的信息 常用的匹配规则 模式 描述 \w 匹配字母.数字及下划线 \ ...
- 【JAVA SE】第十一章 正则表达式、包装类和BigDecimal
第十一章 正则表达式.包装类和BigDecimal 文章目录 第十一章 正则表达式.包装类和BigDecimal 一.正则表达式 二.包装类 1.概述 2.装箱与拆箱: 3.基本数据和包装类之间的转换 ...
- 《精通数据仓库设计》中英对照_第三章
<精通数据仓库设计>中英对照_第三章 第二部分 模型开发 数据仓库应该表示企业数据的各个方面,这些方面以主题域和业务数据模型开始.我们将在第3章使用一个假想的公司,指导一步一步地开发这两个 ...
最新文章
- 小程序之获取用户信息取消授权处理
- unity工程包怎么上传git_如何将Git用于Unity3D源代码管理?
- 0122 - EOS 编程学习日志(1)
- Spring MVC 4.1 支持jsonp
- 在c语言中scanf什么时候用,scanf什么时候用??c语言?
- boost::polygon模块实现多边形点相关的测试程序
- windows上配置新的conda env+torch
- block相对于delegate有哪些优缺点?
- 经济学的概念、术语与常识
- JavaScript课堂笔记!
- 初识Hibernate的主配置和映射配置
- ubb码转换的java类库 ubb2html_ubb代码转换为html
- 基于JEECG框架,前台VUE,后台java,导入导出
- Excel学习系列(1)--以文本存储的数字转换为数字
- 光纤收发器tx和rx是什么意思?二者有什么区别?
- 将RTSP网络摄像机进行网页和微信直播的方案
- 应用Python把汉语Excel表转换为拼音表格
- CEIWEI ParallelMonitor并口监控 v3.0 并口打印机监控, 并口打开印机, 并行端口过滤, 并行端口监控, 并口过滤, 并口监控
- android添加悬浮窗,在Android中使用WindowManager实现悬浮窗口
- matlab学位论文出图
热门文章
- iPhone键盘自定义及通知
- selenium和chrome版本不一致 session not created: This version of ChromeDriver only supports Chrome version
- 美国亚马逊最新要求ASTM F2641 电动滑板车、自平衡踏板车UL2272认证办理流程
- linux db2 执行sql,db2 查看一个连接正在执行的sql
- C语言数字图像处理----3.2 图像边缘检测之Canny边缘检测算法
- C语言中 真值/原码/补码/反码 的概念
- 易语言 图片插入超级列表框_利用PPT制作一个图片抽奖
- 如何使用nginx搭建一个自己本地的域名如(mall.com)
- Streamsets3.23 编译安装,超详细
- 主板上Usb线序规则