程序设计语言处理正则表达式的方式

  1. 集成式:表达式直接内建在语言之中,如Perl
  2. 程序式和面向对象式:正则表达式不属于语言的低级语法。相反,普通的函数接受普通的字符串,把他们作为正则表达式进行处理。

集成式处理

集成式处理方法减轻了程序员的负担,因为它隐藏了一些工作,例如正则表达式的预处理,准备匹配,应用正则表达式,返回结果。但是有时这样处理反而更慢,更复杂。

程序式处理和面向对象式处理

正则功能不是由内建的操作符来提供,而是由普通函数(函数式)或构造函数(面向对象式)来提供的。
Java中的正则处理

常用元字符和特性

字符组及相关结构

  1. 普通字符组:[a-z][^a-z],需要强调的是,元字符的规定在字符组内外饰有差别的。例如,字符组内部的*永远都不是元字符,二-通常都是元字符。有些元序列\b在字符组内外是不一样的。
    字符组通常表示肯定断言。也就是说他们必须匹配一个字符。排除型字符组仍然需要匹配一个字符,只是她没有在字符组内列出而已。

几乎能匹配任何字符的元字符:点号

在某些工具软件中,点好被用来缩略表示可以匹配任何字符的字符组,而在其它工具中,点号匹配除了换行符之外的任何字符。

  1. 在Sun的Java regex package 之类的支持Unicode的系统中,点号不能匹配Unicode的行终结符。
  2. 匹配模式会改变点号的匹配规则。
  3. 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提供(这本书比较老了,现在的情况不知道怎样),占有优先量词类似普通的匹配优先量词,不过他们一旦匹配内容,就不会“交还”。他们类似固化分组。

从某种意义上来说,占有优先量词只是些表面功夫,因为它们可以用固化分组模拟实现。
.++?>.+的结果完全一样,只是足够智能的实现凡是能对占有优先量词进行更多优化。

精通正则表达式第三章:正则表达式的特性和流派概览相关推荐

  1. 第三章 正则表达式括号的作用

    不管哪门语言中都有括号.正则表达式也是一门语言,而括号的存在使这门语言更为强大. 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准. 括号的作用,其实三言两语就能说明白,括号提供了分组, ...

  2. 简单入门正则表达式 - 第三章 快速入门

    一.字面值字符 正则表达式的作用就是根据给定的字符样式,来匹配目标字符串.而这种匹配方案中,最简单的就是字面值字符的匹配. 那么,什么叫字面值字符匹配呢?简单的说,就是输入一个样式ABC,就能把目标字 ...

  3. 《Visual C# 从入门到精通》第三章使用判断语句——读书笔记

    第3章 使用判断语句 3.1 使用布尔操作符 布尔操作符是求值为true或false的操作符. C#提供了几个非常有用的布尔操作符,其中最简单的是NOT(求反)操作符,它用感叹号(!)表示.!操作符求 ...

  4. 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——1 概述

    说明:本系列文章介绍的算法均来自编译原理(龙书)一书,如果读者对代码没有兴趣,只想了解算法思路,完全可以阅读龙书相关章节内容,比我讲得清晰透彻. 序: 啃编译原理半年以来,任然徘徊在前4章,其间反反复 ...

  5. 《精通正则表达式(第三版)》下载

    <精通正则表达式(第三版)> https://pan.baidu.com/s/1PsV0PDasWijZxfGHkrEebA

  6. python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)

    第10章 正则表达式(重点)与JSON 初识正则表达式 元字符与普通字符 字符集 概括字符集 数量词 贪婪与非贪婪 匹配0次1次或者无限多次 边界匹配符(^ .$) 组 匹配模式参数 re.sub正则 ...

  7. Python爬虫学习笔记(三)——正则表达式

    介绍 正则表达式是一种处理字符串的强大工具,能实现字符串的检索.替换.匹配验证等.在爬虫中,正则表达式主要用于从HTML里提取所需要的信息 常用的匹配规则 模式 描述 \w 匹配字母.数字及下划线 \ ...

  8. 【JAVA SE】第十一章 正则表达式、包装类和BigDecimal

    第十一章 正则表达式.包装类和BigDecimal 文章目录 第十一章 正则表达式.包装类和BigDecimal 一.正则表达式 二.包装类 1.概述 2.装箱与拆箱: 3.基本数据和包装类之间的转换 ...

  9. 《精通数据仓库设计》中英对照_第三章

    <精通数据仓库设计>中英对照_第三章 第二部分 模型开发 数据仓库应该表示企业数据的各个方面,这些方面以主题域和业务数据模型开始.我们将在第3章使用一个假想的公司,指导一步一步地开发这两个 ...

最新文章

  1. 小程序之获取用户信息取消授权处理
  2. unity工程包怎么上传git_如何将Git用于Unity3D源代码管理?
  3. 0122 - EOS 编程学习日志(1)
  4. Spring MVC 4.1 支持jsonp
  5. 在c语言中scanf什么时候用,scanf什么时候用??c语言?
  6. boost::polygon模块实现多边形点相关的测试程序
  7. windows上配置新的conda env+torch
  8. block相对于delegate有哪些优缺点?
  9. 经济学的概念、术语与常识
  10. JavaScript课堂笔记!
  11. 初识Hibernate的主配置和映射配置
  12. ubb码转换的java类库 ubb2html_ubb代码转换为html
  13. 基于JEECG框架,前台VUE,后台java,导入导出
  14. Excel学习系列(1)--以文本存储的数字转换为数字
  15. 光纤收发器tx和rx是什么意思?二者有什么区别?
  16. 将RTSP网络摄像机进行网页和微信直播的方案
  17. 应用Python把汉语Excel表转换为拼音表格
  18. CEIWEI ParallelMonitor并口监控 v3.0 并口打印机监控, 并口打开印机, 并行端口过滤, 并行端口监控, 并口过滤, 并口监控
  19. android添加悬浮窗,在Android中使用WindowManager实现悬浮窗口
  20. matlab学位论文出图

热门文章

  1. iPhone键盘自定义及通知
  2. selenium和chrome版本不一致 session not created: This version of ChromeDriver only supports Chrome version
  3. 美国亚马逊最新要求ASTM F2641 电动滑板车、自平衡踏板车UL2272认证办理流程
  4. linux db2 执行sql,db2 查看一个连接正在执行的sql
  5. C语言数字图像处理----3.2 图像边缘检测之Canny边缘检测算法
  6. C语言中 真值/原码/补码/反码 的概念
  7. 易语言 图片插入超级列表框_利用PPT制作一个图片抽奖
  8. 如何使用nginx搭建一个自己本地的域名如(mall.com)
  9. Streamsets3.23 编译安装,超详细
  10. 主板上Usb线序规则