正则表达式之常用量词

{m,n}是通用形式的量词,正则表达式还有三个常用量词,分别是+?*。它们的形态虽然不同于{m,n},功能却是相同的(也可以把它们理解为“量词简记法”),具体说明见表2-2。

表2-2  常用量词

常用量词

{m,n}等价形式

说明

*

{0,}

可能出现,也可能不出现,出现次数没有上限

+

{1,}

至少出现1次,出现次数没有上限

?

{0,1}

至多出现1次,也可能不出现

在实际应用中,在很多情况只需要表示这三种意思,所以常用量词的使用频率要高于{m,n},下面分别说明。

大家都知道,美国英语和英国英语有些词的写法是不一样的,比如traveler和traveller,如果希望“通吃”traveler和traveller,就要求第2个l是“至多出现1次,也可能不出现”的,正好使用?量词:travell?er,如例2-4所示。

例2-4  量词?的应用

re.search(r"^travell?er$","traveler") != None  #  => True

re.search(r"^travell?er$","traveller") != None     #  => True

其实这样的情况还有很多,比如favor和favour、color和colour。此外还有很多其他应用场合,比如http和https,虽然是两个概念,但都是协议名,可以用https?匹配;再比如表示价格的字符串,有可能是100也有可能是¥100,可以用¥?100匹配。

量词也广泛应用于解析HTML代码。HTML是一种“标签语言”,它包含各种各样的tag(标签),比如<head>、<img>、<table>等,这些tag的名字各异,形式却相同:从<开始,到>结束,在<和>之间有若干字符,“若干”的意思是长度不确定,但不能为0(<>并不是合法的tag),也不能是>字符。如果要用一个正则表达式匹配所有的tag,需要用<匹配开头的<,用>匹配结尾的>,用[^>]+匹配中间的“若干字符”,所以整个正则表达式就是<[^>]+>,程序如例2-5所示。

例2-5  量词+的应用

re.search(r"^<[^>]+>$","<bold>") != None       #  => True

re.search(r"^<[^>]+>$","</table>") != None         #  => True

re.search(r"^<[^>]+>$","<>") != None           #  => False

类似的,也可以使用正则表达式匹配双引号字符串。不同的是,双引号字符串的两个双引号之间可以没有任何字符,""也是一个完全合法的双引号字符串,应该使用量词*,于是整个正则表达式就成了"[^"]*",程序见例2-6。

例2-6  量词*的应用

re.search(r"^\"[^\"]*\"$","\"some\"") != None  #  => True

re.search(r"^\"[^\"]*\"$","\"\"") != None          #  => True

注:字符串之中表示双引号需要转义写成\",这并不是正则表达式中的规定,而是为字符串转义考虑。

量词的使用有很多学问,不妨多看几个tag匹配的例子:tag可以粗略分为open tag和close tag,比如<head>就是open tag,而</html>就是close tag;另外还有一类标签是self-closing tag,比如<br/>。现在来看分别匹配这三类tag的正则表达式。

open tag的特点是以<开头,然后是“若干字符”(但不能以/开头),最后是>,所以对应的正则表达式是<[^/][^>]*>;注意:因为[^/]必须匹配一个字符,所以“若干字符”中其他部分必须写成[^>]*,否则它无法匹配名字为单个字符的标签,比如<b>。

close tag的特点是以<开头,之后是/字符,然后是“若干字符(但不能以/开头)”,最后是>,所以对应的正则表达式是</[^>]+>

self-closing tag的特点是以<开头,中间是“若干字符”,最后是/>,所以对应的正则表达式是<[^>]+/>。注意:这里不是<[^>/]+/>,排除型字符组只排除>,而不排除/,因为要确认的只是在结尾的>之前出现/,如果写成<[^>/]+/>,则要求tag内部不能出现/,就无法匹配<img src="http://somehost/picture" />这类的tag了。

表2-3列出了匹配几类tag的表达式。

表2-3  各类tag的匹配

匹配所有tag的表达式

tag分类

匹配分类tag的表达式

<[^>]+>

open tag

<[^/>][^>]*>

close tag

</[^>]+>

self-closing tag

<[^>/]+/>

对比表格中“匹配所有tag的表达式”和“匹配分类tag的表达式”,可以发现它们的模式是相近的,只是细节上有差异。也就是说,通过变换字符组和量词,可以准确控制正则表达式能匹配的字符串的范围,达到不同的目的。这其实是使用正则表达式时的一条根本规律:使用合适的结构(包括字符组和量词),精确表达自己的意图,界定能匹配的文本。

再仔细观察,你或许会发现,匹配open tag的表达式,也可以匹配self-closing tag:<[^/][^>]*>能够匹配<br/>,因为[^>]*并不排除对/的匹配。那么将表达式改为<[^/][^>]*[^/]>,就保证匹配的open tag不会以/>结尾了。

不过这会产生新的问题:<[^/][^>]*[^/]>能匹配的tag,在<和>之间出现了两个[^/],上一章已经讲过,排除型字符组表示“在当前位置,匹配一个没有列出的字符”,所以tag里的字符串必须至少包含两个字符,这样就无法匹配<u>了。

仔细想想,真正要表达的意思是,在tag内部的字符串不能以/开头,也不能以/结尾,如果这个字符串只包含一个字符,那么它既是开头,又是结尾,使用两个排除型字符组显然是不合适的,看起来没办法解决了。实际上,只是现有的知识还不足够解决这个问题而已,在第68页有这个问题的详细解法。

本文节选自《正则指引》一书余晟著

图书详细信息:http://blog.csdn.net/broadview2006/article/details/7569554

正则表达式之常用量词相关推荐

  1. python 正则表达式re常用操作符 使用方法 怎么用re正则表达式表示一个IP地址:0-255

    正则表达式:(三种表达方法) regular expression regex RE 正则表达式是用来简洁表达一组字符串的表达式. 正则表达式: 通用的字符差表达框架 简洁表达一组字符串的表达式 针对 ...

  2. c#中regex的命名空间_C#_详解C#正则表达式Regex常用匹配,使用Regex类需要引用命名空间 - phpStudy...

    详解C#正则表达式Regex常用匹配 使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 一.利用Regex类实现验证 示例1:注释的代码所起 ...

  3. 正则表达式、常用的匹配总结

    1.正则表达式:我的理解就是,记录文本规则的代码,我主要运用它在.net表单验证中. 2.学习正则表达是的工具下载链接:https://sourceforge.net/projects/regexte ...

  4. Oracle 正则表达式以及常用正则函数

    Oracle 正则表达式以及常用正则函数 正则表达式简介 正则表达式基础 Oracle 常用正则函数 正则表达式简介 菜鸟教程 练习网站 软件下载 什么是正则表达式? 正则表达式,又称规则表达式.(英 ...

  5. 正则表达式与常用文本处理工具

    正则表达式与常用文本处理工具 正则表达式概述 基础正则表达式 基础正则表达式元字符 扩展正则表达式 概述 扩展元字符 文本处理器 grep 示例 sed sed 命令 示例 输出文件内容 删除符合条件 ...

  6. 正则表达式、常用类(Pattern类、Matcher类、Math类、System类、Random类、BigDecimal类、Date类、SimpleDateFormat类、Calendar类)

    JAVA学习第十六天-正则表达式.常用类(Pattern类.Matcher类.Math类.System类.Random类.BigDecimal类.Date类.SimpleDateFormat类.Cal ...

  7. 前端开发中的 正则表达式 及常用正则表达式大全

    RegExp 是正则表达式(Regular expression)的缩写,就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征.比如 ...

  8. 正则表达式(常用正则表达式)

    一.正则表达式 1.被选字符:规定某字符上的被选字符集(例:[0-9].[a-z].[A-Z]): 2.预定义字符集:常用备选字符的简化符号: 2.1.[0-9]                    ...

  9. 正则表达式(常用版)

    正则表达式 点击跳转:正则详情版+常用表达式 是用来描述字符串内容格式,使用它通常用于匹配一个字符串的内容是否符合格式要求 正则表达式的语法: 1.[]:表示一个字符,该字符可以是[]中指定的内容 例 ...

  10. 关于grep,egrep正则表达式的常用用法

    正则表达式是一类字符所书写的模式(pattern) 元字符:不表示字符本身的意义,而用于额外功能性的描述:而如果在这些特定的字符前加/这个符号那么这些字符就表示原有的意思. 正则表达式:基本正则表达式 ...

最新文章

  1. 什么是Express.js?
  2. Windows的驱动开发模型
  3. 网站的高性能架构--web前端优化
  4. Windows 操作系统的安全设置
  5. MySQL往数据库中存入中文字符时变问号
  6. x86的32位汇编快速入门
  7. perl one line
  8. WGS84坐标和UTM坐标的转换
  9. DirectX11 学习笔记3 - 创建一个立方体 和 轴
  10. Android中native进程内存泄露的调试技巧
  11. asp.net 路径
  12. python中home定义是什么_关于python中的module你需要了解的
  13. Chrome插件分享—不定期更新
  14. 新媒体运营必备的实用工具
  15. 怎么禁用笔记本的键盘
  16. 20201024——记录一下自己的前端工程师之路
  17. 微信与朋友圈后台架构
  18. 惠普p1106打印机安装步骤_hp1106打印机安装驱动下载
  19. Clipboard.js 实现点击复制
  20. 极值理论(二):阈值超越量与尾部估计

热门文章

  1. Ztree 仿淘宝树结构完美实现 移动 右键增删改
  2. Python模拟登录的几种方法
  3. ORA-00054:资源正忙,但指定以nowait方式
  4. 第一次用Axure~
  5. 题目1088:剩下的树(小端快排+大端判断边界)
  6. EOG眼电信号(眨眼检测)
  7. synchronized锁机制 之 代码块锁(转)
  8. Lucas定理(求组合数,例题FZU2020,HDU3944)
  9. CS20Chapter2
  10. Latente Wärme