`
javasogo
  • 浏览: 1770904 次
  • 性别: 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>

一、字符集合

字符集合,也可以叫做字符类,它允许我们从多个候选字符中提取一个满足条件的字符。它的语法形式有两种,[abcdef][a-f]。虽然是集合,但每次只允许匹配一个单字符,如果要进行重复性匹配操作,就要借助“*”、“+”和花括号的功能了。让我们先学习一下[abcdef]这种形式的用法。

假如我们要对电话号码格式进行验证,以“+086-800-800-8888”为例,其中 +086 的加号和首位数字都是可选字符。现在,我们对号码的第二个字符进行分析,它是一个 0 至 9 的数字,字符集合的表示方法是[0123456789],它可以与 0 至 9 之间的任意一个字符进行匹配。接下来我们要做的就是确定每个部分的匹配次数,[0123456789]{3}[0123456789]{3}[0123456789]{3}[0123456789]{4}。又因为 086 的首位可选,所以,我们最终构造出来的正则表达式语法为/+?[0123456789]{2,3}-[0123456789]{3}-[0123456789]{3}-[0123456789]{4}。这里值得注意的地方是“+”需要转义,因为“+”是正则表达式的语法一部分,它是具有特殊含义的,无法被我们直接利用,如果要使用“+”,就要对它进行转义。转义后的“/+”能告诉正则表达式引擎,当前这个“+”不是语法具有特殊意义,只是一个字符“+”而已。

二、字符范围的表示

字符集合的第二种语法形式[a-f]可以简化连续字符的书写方法,上例中的[0123456789]就能够简化为[0-9],这样,简化后的语法就成为/+?[0-9]{2,3}-[0-9]{3}-[0-9]{3}-[0-9]{4}。我们还可以混合使用字符集合的语法,来提高灵活性。如[a-fuwy0-9]

如果方括号内的“-”的两端不是表示范围开始和结束的字符的话,它就会被当作普通的“-”来处理。让我们再看一个例子。现在要从句子“Javascript includes built-in support for array, date, and Regular-expression objects.”中提取那些含有“-”的复合词。我们先采用字符集合的形式来匹配“-”,使用语法[a-zA-z]+[-][a-zA-z]+,当然我们也可以直接写“-”来进行匹配[a-zA-z]+-[a-zA-z]+

看了上面的例子有些读者可能会感到很奇怪,既然可以指定字符集合的范围,我们为什么不直接写[A-z],而要采用[a-zA-Z]这种形式呢?这是因为在ASCII和Unicode字符集中,大小写字母的位置并不是连续的,它们之间还有六个其它字符,如下图所示:

三、使用补集^

前面的两种语法都是正常匹配时所要用到的,但是,如果我们想使一个不存在于字符集合中的字符满足匹配条件时,又该怎么实现呢?换一句话说,除了集合之外的所有字符都是我们想要匹配的字符,正则表达式提供了一种[^abcf-i]的语法形式。对于这种语法,我们可以先按照正常思路考虑[abcf-i]的含义,匹配 abc 中任意一字符和 f 至 i 之间的字符,然后转过来理解,不满足 abc 中任意一字符和 f 至 i 之间的字符的内容,都是我们想要匹配的目标。值得注意的是“^”必须紧挨在左方括号的右边,否则它就不具有特殊含义,只是普通的字符“^”而已。

四、选择

字符集合能够从多个候选字符中选中一个来与目标字符进行匹配,但是,如何提供多个连续的候选字符组合呢?在正则表达式中,就有一个提供这样功能的元字符“|”。它将我们要匹配的字符组合用“|”分隔开,然后在目标字符串中进行匹配,只要有与分隔部分的内容能够匹配上的话,就能进行匹配。

下面是一段人物众多的小笑话,要理解起来本来是很费劲儿的,但通过正则表达式魔王|公主|没有人|曹操|鬼|靠|谁|上帝把所有的人物角色全列出来,就容易理解得多了。

《喊破喉咙》
魔王公主带回了自己的城堡。 
魔王:你尽管喊破喉咙吧,没有人会来救你的! 
公主:破喉咙!破喉咙! 
没有人公主!我来救你了! 
魔王:说曹操曹操到! 
曹操魔王,你叫我干嘛?! 
魔王:哇勒!看到了!! 
!被发现了! 
:胡说,发现我了! 
:关我屁事! 
魔王:Oh~my God! 
上帝叫我?! 
没有人叫你啊! 
没有人:我哪有!! 
魔王从此得了精神分裂症…… 
	

五、知识要点补充与巩固

到现在为止,我们已经学会了很多基本的样式匹配,下面表格中是对前面的知识内容的一个总结。

语法形式 语法含义
A 匹配一个单一字符“A”
. 匹配任意一个字符
? 重复零次或一次
/? 转义后的字符“?”
* 重复零次或更多次(贪婪模式)
+ 重复一次或更多次(贪婪模式)
*? 重复零次或更多次(懒惰模式)
+? 重复一次或更多次(懒惰模式)
{n} 重复 n 次
{n,} 重复 n 次或更多次
{m,n} 重复 m 到 n 次(贪婪模式)
{m,n}? 重复 m 到 n 次(懒惰模式)
[abc] 匹配“a”,“b”,“c”中的任意一个字符
[abcf-i] 匹配“a”,“b”,“c”,“f”至“g”中的任意一个字符
[^1-37a-gx] 匹配“1”至“3”,“7”,“a”至“g”,“x”之外的任意一个字符
<!-- InstanceEndEditable -->
分享到:
评论

相关推荐

    精通正则表达式~~~

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

    [精通正则表达式(第三版)]

    第 1 章 正则表达式入门 29 解决实际问题 30 作为编程语言的正则表达式 32 以文件名做类比 32 以语言做类比 33 正则表达式的思维框架 34 对于有部分经验的读者 34 Egrep元字符 36 行的起始和结束 36 字符组...

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

    考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2...

    正则表达式必知必会pdf

    匹配一组字符3.1 匹配多个字符中的某一个3.2 利用字符集合区间3.3 取非匹配3.4 小结第4章 使用元字符4.1 对特殊字符进行转义4.2 匹配空白字符4.3 匹配特定的字符类别4.4 使用POSIX字符类4.5 小结第5章 重复匹配5.1 ...

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

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

    Python核心编程 第二版

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

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

    Perl语言入门(第五版),本书是为中文版本,英文原版下载地址:http://download.csdn.net/source/2801846。 原书名: Learning Perl, 5th Edition;原出版社: O'Reilly Media, Inc. ;作者: Randal L.Schwartz Tom ...

    Perl 语言入门 第六版

    第五章输入与输出 读取标准输入 来自钻石操作符的输入 调用参数 输出到标准输出 JNprintf格式化输出 数组和printf 文件句柄 打开文件句柄 以二进制方式读写文件句柄 有问题的文件句柄 关闭文件句柄 用...

    JavaScript王者归来part.1 总数2

     第5章 数据类型  5.1 基本数据类型   5.2 数组和对象   5.2.1 数组   5.2.2 对象--一个构造函数的例子   5.3 函数类型--一个函数和闭包的例子   5.4 神奇的null和undefined   5.4.1 null   5.4.2 ...

    JavaScript版 数据结构与算法

    原理讲解 4-4 正则表达式匹配-代码演示 第5章 基础算法之“排序类”排序是学生时代标志性的回忆,然而如何魔改“冒泡排序”、“选择排序”让很多看似与排序无关的题目迎刃而解是不是闻所未闻,还等什么呢?...

    Perl语言入门_第五版.pdf

    ·正则表达式 ·字符串的操作.. ·列表与排序 ·进程的管理 ·智能匹配 ·第三方模块的使用 有些人只是想要完成任务,Perl语言为此而生。Perl的最初目标只是为了协助Unix系统管理员完成日常繁琐的文本数据处理工作。...

    Perl语言入门 (第五版) 高清中文PDF版 -- 002

    《Perl语言入门 (第五版) 高清中文PDF版》(O'Reilly Learning Perl, 5th Edition)((美)施瓦茨 & (美)菲尼克斯 & (美)福瓦)[PDF] 内容简介 《Perl语言入门》也就是大家所称道的 “小骆驼书”,是Perl程序设计人员...

    Perl语言入门 (第五版) 高清中文PDF版 -- 001

    《Perl语言入门 (第五版) 高清中文PDF版》(O'Reilly Learning Perl, 5th Edition)((美)施瓦茨 & (美)菲尼克斯 & (美)福瓦)[PDF] 内容简介 《Perl语言入门》也就是大家所称道的 “小骆驼书”,是Perl程序设计人员...

    Perl语言入门_第五版

    ·正则表达式 ·字符串的操作.. ·列表与排序 ·进程的管理 ·智能匹配 ·第三方模块的使用 有些人只是想要完成任务,Perl语言为此而生。Perl的最初目标只是为了协助Unix系统管理员完成日常繁琐的文本数据处理...

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

    hda1中的“1”代表hda的第一个硬盘分区 (partition),hda2代表hda的第二主分区,第一个逻辑分区从hda5开始,依此类推。此外,可以直接检查 /var/log/messages文件,在该文件中可以找到计算机开机后系统已辨认出来的...

    PHP和MySQL WEB开发(第4版)

    第5章 代码重用与函数编写 5.1 代码重用的好处 5.1.1 成本 5.1.2 可靠性 5.1.3 一致性 5.2 使用require()和include()函数 5.2.1 文件扩展名和require()语句 5.2.2 使用require()制作Web站点的模版 5.2.3 使用auto_...

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

    第5章 代码重用与函数编写 5.1 代码重用的好处 5.1.1 成本 5.1.2 可靠性 5.1.3 一致性 5.2 使用require()和include()函数 5.2.1 文件扩展名和require()语句 5.2.2 使用require()制作Web站点的模版 5.2.3 ...

    PHP和MySQL Web开发第4版

    第5章 代码重用与函数编写 5.1 代码重用的好处 5.1.1 成本 5.1.2 可靠性 5.1.3 一致性 5.2 使用require()和include()函数 5.2.1 文件扩展名和require()语句 5.2.2 使用require()制作Web站点的模版 5.2.3 ...

    shell 编程指南pdf

    第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 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准...

    JavaScript实战

    第5章 动态修改Web页面 115 5.1 修改Web页面:概览 116 5.2 理解文档对象模型 117 5.2.1 选择页面元素 118 5.2.2 给页面添加内容 122 5.2.3 再谈月球测验 123 5.2.4 DOM的问题 126 5.3 JavaScript库简介 127 初学...

Global site tag (gtag.js) - Google Analytics