`
javasogo
  • 浏览: 1772383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

简单入门正则表达式 - 第四章 单字符的匹配

 
阅读更多
<style> #content-region { background-image: url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif); } #content-region h3 { border: 1px dotted #333333; background-color: #f9f9f9; padding: 10px; font-size: 24px; } #content-region p { font-family: "宋体", "仿宋"; font-size: 16px; line-height: 28px; text-decoration: none; text-indent: 32px; } #content-region .regex-pattern { font-style: oblique; font-family: "Courier New", Courier, monospace; background-color: #FFCCCC; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #FF0000; border-bottom-color: #FF0000; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #FF0000; border-left-color: #FF0000; padding: 0px 5px 0px 5px; } #content-region .regex-result { font-family: "Courier New", Courier, monospace; background-color: #A4FFE1; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #339966; border-bottom-color: #339966; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #339966; border-left-color: #339966; padding: 0px 5px 0px 5px; } #content-region blockquote { padding: 10px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; width: auto; } #content-region img { border: 1px dotted #000000; padding: 16px; background-color: #f9f9f9; margin-top: 16px; margin-right: 16px; margin-bottom: 16px; margin-left: 64px; } #content-region code { white-space: pre; } </style>

一、单一字符的匹配

正则表达式中,最简单的匹配就是单字符匹配了,这就像我们利用文本工具在文档中查找一个字符一样简单。下面我们使用 EmEditor 来做个小实验,在字符串“Regular Expression”中查找字符“e”。

Ctrl+F 打开查找对话框,然后在“查找”框内键入字符“s”,并选用“匹配大小写”和“使用正则表达式”模式,然后进行查找操作。从上图的效果来看,同时有两个“s”被匹配到了,但实际上这是执行了两次匹配操作的结果,每次操作只匹配了一个字符“s”,操作顺序是自左向右。让我们再尝试使用 Expresso 就能看出其中的奥秘,如下图所示:

在“Regular Expression”的选项卡下输入“s”,“Sample Input Data”区域中输入字符串“Regular Expression”,在单击“Run Match”按钮就能看到匹配结果。在上图的右下角出现了两个“s”,这是发生了两次匹配操作,每次都有一个结果的缘故。

二、任意字符的匹配

当我们使用计算机时,经常需要打开和保存文件,这就免不了要与打开/保存对话框打交道,其中涉及到的文件类型都采用 * 点扩展名这种形式。比如说 HTML 文件,它所对应的文件类型就是 *.html 或 *.htm,星号就是一个通配符,表示与任意字符匹配,而在正则表达式中,也有这么一个通配符“.”,它可以与任意单字符相匹配,但通常不包括换行符。

接着上面的例子,我们把正则表达式样式修改为p.e.s,这时的通配符“.”就分别与目标字符串的“r”和“s”相匹配,结果为“Regular Expression”。

三、匹配可选字符

在匹配目标字符串时,有时候可能会有些特殊需求,比方说我们要对词组“Regular Expression”或者“Regular Expressions”进行匹配,无论哪种形式的词组,我们都想能够成功匹配。这时,单词“Expression”后面的“s”就是可选的,在正则表达式中,问号表示它所指定的样式出现的次数为零次或一次,所以,我们可以编写正则表达式Regular Expressions? 来进行匹配。

四、特殊字符的处理

到目前为止,常规字符我们都可以成功地进行匹配,但是,还有一种情况就是像问号这样在正则表达式中含有特殊意义的字符,对于这些字符来说,我们是无法直接利用它们进行匹配操作,那该如何对这些符进行转义呢?跟许多程序语言一样,正则表达式也提供了一个转义的处理机制,我们可以使用转义操作符反斜杆“/”。所以,如果我们想匹配问号和点,使用“/?”和“/.”就可以。同样,对于转义符“/”来说,它对自身也可以实现转义功能,连续的两个“/”代表了一个字符“/”。

修改上面的正则表达式为Regular Expression/?,它就能与字符串“Regular Expression?”相匹配了。在编写正则表达式时,如果碰到了要匹配特殊字符的情况,那就一定要使用转义操作。

五、“*”与“+”

同“?”和“.”一样,“*”和“+”也是具有特殊含义的字符,它们的作用是让某个指定了的正则表达式样式进行多次重复匹配。“*”的重复次数是从零开始的,规定其前导内容必须在目标字符串中出现零次或更多次;而“+”所对应的重复次数是从一开始的,规定其前导内容必须在目标字符串中出现一次或更多次。它们的重复次数都没有上限值限制,也就是说它们的前导内容可以在目标字符串中不断地重复出现。

正则表达式ABC9*表示一个以“ABC”开头,后面为零个或多个连续“9”的字符串。这样,它就能与字符串“ABC”、“ABC9”、“ABC99”和“ABC999”等内容相匹配了。

我们先来分析一下对字符串“ABC”的匹配,当正则表达式引擎对ABC匹配结束后,下一个参与匹配的字符就应该是“9”,但根据“*”的零次匹配原则,“9”是可以不出现的,所以,字符串“ABC”就成功地被匹配了。

再来看一下字符串“ABC999”,对字符“C”的匹配结束后,碰到的下一个字符就是“9”,成功匹配之后,继续下一个字符,一直到最后一个字符为止,字符“9”出现的次数与“*”的多次匹配原则保持一致,所以字符串“ABC999”也能够被成功匹配。

六、花括号的使用

上面介绍了如何让我们的匹配内容进行无限次的循环匹配,现在,我们学习一下怎么样精确地控制循环匹配次数。正则表达式提供了一种使用花括号的方法控制循环匹配次数,语法形式有{n}、{n,}、{m,n}三种,其中 m 和 n 都是非负整数,且 m 的值小于 n值。

{n} 代表了被指定的匹配样式必须在目标对象中重复出现 n 次;{n,}表示被指定的匹配样式在目标对象中至少要重复出现 n 次,但无上限值限制;{m,n}指定了循环次数的范围,至少要重复出现 m 次,至多重复出现 n 次,如果 m 值比 n 大,{m, n}的作用就相当于{m, m}。

现在,我们思考一个问题,“*”和“+”同样能够对重复匹配的次数做出限定,那么,如何用花括号形式表示呢?由于“*”表示指定的匹配样式要重复出现 0 或多次,所以,我们可以先用{0}满足重复出现 0 次的要求。但是如又何满能够足重复多次的要求呢,由于最终重复出现的次数是不固定的,我们就不能采用{m,n}这种形式,现在也只有采用最后一种形式{n,},“*”对应的花括号表现形式为{0,}。同理可推“+”对应的花括号表现形式为{1,},相对于用于可选匹配的“?”来说,用{0,1}来替换即可。

七、贪婪模式与懒惰模式

当我们使用含有次数限制的匹配语法时,常常会碰到正则表达式中的贪婪式与懒惰式的概念。那它们到底是什么意思呢?先看一下下面两种对HTML标记进行匹配的例子,构造正则表达式<.+>来匹配字符串“<a>W3C A to Z</a>”,如下图所示:

为什么<.+>并没有像我们预想的那样匹配每一个HTML标记,而是一次性“吃掉”了所有的内容呢?这就是贪婪的匹配模式!让我们分析一下正则表达式引擎的匹配机制,就会明白其中的道理了。首先要匹配的字符是“<”(匹配过程01),这个一点问题也没有,然后轮到通配符“.”上场了,因为它后面紧跟着一个“+”,这就能让它毫无顾忌的一个劲儿匹配下去,当匹配到字符串“<a>W3C A to Z</a>”最后一个字符“>”时,引擎发现无法找到相匹配的字符串,就尝试着回退,把最后一次机会让给“>”。结果当然是匹满足条件的了,这就是为什么匹配结果是整个目标字符串而不是“<a>”和“</a>”。

匹配过程01 => <
匹配过程02 => <a>W3C A to Z</a>
匹配过程03 => <a>W3C A to Z</a>backtrack
匹配过程04 => <a>W3C A to Z</a
匹配过程05 => <a>W3C A to Z</a>
匹配过程06 => Match found

接下来,我们再分析一下采用懒惰模式的正则表达式<.+?>,贪婪模式与懒惰模式的语法区别在于重复限定修饰符的后面是否有问号,有的话就是懒惰模式,否则就是贪婪模式。

懒惰模式下匹配的结果有两个,“<a>”和“</a>”。对于前者的匹配过程是,首先匹配首字符“<”;然后再将“.”与“a”相匹配,这时“.”已经满足了“+”的匹配次数至少要达到一次的要求,由于懒惰模式的缘故,“+”只要能满足匹配条件就不会继续执行下去;接下来要参与匹配的字符就是“>”,这时恰好满足整个正则表达式的要求。对于后者来说要稍微复杂一点,当第二步“.”与“/”匹配后,第三步就要直接用“>”进行匹配,但“>”并不能与“a”相匹配,所以只能放弃,继续由“.”再次担任匹配任务;与“a”匹配完毕后,重新尝试用“>”进行匹配操作,这次匹配成功并且目标字符串再没有可以参与匹配操作的字符串,整个匹配过程顺利结束,结果就是“</a>”。

<
<a
<a>
Match found
<
</
</backtrack
</a
</a>
Match found

不光是“*”和“+”有贪婪与懒惰两种模式,花括号语法同样存在相同的情况。如果用正则表达式(as){3, 4}来匹配字符串“asasasasas”,结果就是“asasasasas”,有四组“as”被匹配;要是换成(as){3,4}?,结果就是“asasasasas”,有三组“as”被匹配。

<!-- InstanceEndEditable -->
分享到:
评论

相关推荐

    Python程序设计:正则表达式检索与替换.pptx

    正则表达式是一个特殊的字符序列,它能方便的检查一个字符串是否与某种模式匹配,利用正则可以快速准确的对邮箱进行校验。 任务 邮箱验证 任务知识点 正则表达式概念与语法 常用匹配规则 正则表达式检索与替换 知识...

    精通正则表达式~~~

    精通正则表达式第三版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于...

    C# 最全的日期正则表达式,没有之一

    4 日期正则表达式扩展 4.1 “年月日”形式扩展 以上实现的是yyyy-MM-dd格式的日期验证,考虑到连字符的不同,以及月和日可能为M和d,即yyyy-M-d的格式,可以对以上正则进行扩展 ^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0...

    正则表达式必知必会pdf

    目录 · · · · · ·第1章 正则表达式入门1.1 正则表达式的用途1.2 如何使用正则表达式1.3 什么是正则表达式1.4 使用正则表达式1.5 在继续学习之前1.6 小结第2章 匹配单个字符2.1 匹配纯文本2.2 匹配任意字符2.3 ...

    正则表达式30分钟入门教程

    这几乎是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种...

    Python核心编程 第二版

    第4章 Python对象 第5章 数字 第6章 序列:字符串、列表和元组 第7章 映像和集合类型 第8章 条件和循环 第9章 文件和输入输出 第10章 错误和异常 第11章 函数和函数式编程 第12章 模块 第13章 面向对象...

    Perl语言入门(第五版-中文版).pdf

    第四章子程序 定义子程序 调用子程序 返回值 参数 子程序中的私有变量 长度可变的参数列表 关于词法(my)变量 use strict编译命令 return操作符 非标量返回值 持久性私有变量 习题 第五章输入与输出 ...

    Perl 语言入门 第六版

    第八章用正则表达式进行匹配 第九章用正则表达式处理文本 第十章其他控制结构 第十一章Perl模块 第十二章文件测试 第十三章目录操作 第十四章字符串与排序 第十五章智能匹配与given—when结构 第十六章进程...

    正则入门连载!(献给不及格的程序员们)第1/4页

    正则表达式 通过与大多数读者已经熟悉的一些概念进行比较,说明正则表达式的概念。 本篇内容全部来是 微软 公司 文档 对此表示感谢,像那些为此而工作过的人们. 除非您以前使用过正则表达式,否则您可能不熟悉...

    JavaScript王者归来part.1 总数2

     第4章 语言结构  4.1 JavaScript的基本文法   4.2 常量和变量   4.3 表达式和运算符符   4.4 控制语句 句   4.5 总结   第5章 数据类型  5.1 基本数据类型   5.2 数组和对象   5.2.1 数组   ...

    JavaScript版 数据结构与算法

    3-2 电话号码组合-原理讲解 3-3 电话号码组合-代码演示 3-4 卡牌分组-原理讲解 3-5 卡牌分组-代码演示 3-6 种花问题-原理讲解 3-7 种花问题-代码演示 3-8 格雷编码-原理讲解 3-9 格雷编码-代码演示第4章 基础算法之...

    PHP和MySQL WEB开发(第4版)

    第4章 字符串操作与正则表达式 4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:addslashes()和...

    PHP和MySQL Web开发第4版pdf以及源码

    第4章 字符串操作与正则表达式 4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:...

    入门学习Linux常用必会60个命令实例详解doc/txt

    a代表第一个设备,通常IDE接口可以接上4个IDE设备(比如4块硬盘)。所以要识别IDE硬盘的方法分别就是hda、hdb、hdc、 hdd。hda1中的“1”代表hda的第一个硬盘分区 (partition),hda2代表hda的第二主分区,第一个逻辑...

    PHP和MySQL Web开发第4版

    第4章 字符串操作与正则表达式 4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:...

    shell 编程指南pdf

    第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1...

    JavaScript实战

    第4章 操作字符串、数值和日期 77 4.1 快速对象介绍 78 4.2 字符串 80 4.2.1 确定字符串的长度 80 4.2.2 改变字符串的大小写 80 4.2.3 查找一个字符串:indexOf( )技术 81 4.2.4 使用slice( )提取字符串的一部分 83 ...

    Python核心编程第二版(ok)

     第4章 Python对象   4.1 Pythonc对象   4.2 标准类型   4.3 其他内建类型   4.3.1 类型对象和type类型对象   4.3.2 None--Python的Null对象   4.4 内部类型   4.4.1 代码对象   4.4.2 帧...

    Caoutchouc:该库允许用户使用“交互树”解析字符串。 例如,它可以用来创建tchat AI

    该库使您可以搜索与树的正则表达式或文字字符串匹配的字符串。 当搜索匹配时,您将从树中获取关联的数据。 搜索结果基于树中当前的搜索级别。 该库正在积极开发中,仅在其开始之时。 进展中的文件#介绍# 本教程/...

    Python核心编程第二版

     第4章 Python对象   4.1 Python 对象   4.2 标准类型   4.3 其他内建类型   4.3.1 类型对象和type类型对象   4.3.2 None--Python的Null对象   4.4 内部类型   4.4.1 代码对象   4.4.2 帧...

Global site tag (gtag.js) - Google Analytics