全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

正则表达式教程之重复匹配详解

本文实例讲述了正则表达式教程之重复匹配。分享给大家供大家参考,具体如下:

注:在所有例子中正则表达式匹配结果包含在源文本中的之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。

一、有多少个匹配

前面几篇讲的都是匹配一个字符,但是一个字符或字符集合要匹配多次,应该怎么做呢?比如要匹配一个电子邮件地址,用之前说到的方法,可能有人会写出像\w@\w\.\w这样的正则表达式,但这个只能匹配到像a@b.c这样的地址,明显是不正确的,接下来就来看看如何匹配电子邮件地址。

首先要知道电子邮件地址的组成:以字母数字或下划线开头的一组字符,后面跟@符号,再后面是域名,即用户名@域名地址。不过这也跟具体的邮箱服务提供商有关,有的在用户名中也允许.字符。

1、匹配一个或多个字符

要想匹配同一个字符(或字符集合)的多次重复,只要简单地给这个字符(或字符集合)加上一个+字符作为后缀就可以了。+匹配一个或多个字符(至少一个)。如:a匹配a本身,a+将匹配一个或多个连续出现的a;[0-9]+匹配多个连续的数字。

注意:在给一个字符集合加上+后缀的时候,必须把+放在字符集合的外面,否则就不是重复匹配了。如[0-9+]这样就表示数字或+号了,虽然语法上正确,但不是我们想要的了。

文本:Hello, mhmyqn@qq.com or mhmyqn@126.com is my email.

正则表达式:\w+@(\w+\.)+\w+

结果:Hello, 【mhmyqn@qq.com】 or 【mhmyqn@126.com】 is my email.

分析:\w+可以匹配一个或多个字符,而子表达式(\w+\.)+可匹配像xxxx.edu.这样的字符串,而最后不会是.字符结尾,所以后面还会有一个\w+。像mhmyqn@xxxx.edu.cn这样的邮件地址也会匹配到。

2、匹配零个或多个字符

匹配零个或多个字符使用元符*,它的用法和+完全一样,只要把它放在一下字符或字符集合的后面,就可以匹配该字符(或字符集合)连续出现零次或多次。如正则表达式ab*c可以匹配ac、abc、abbbbbc等。

3、匹配零个或一个字符

匹配零个或一个字符使用元字符?。像上一篇说到的匹配一个空白行使用正则表达式\r\n\r\n,但在Unix和Linux中不需要\r,就可以使用元字符?,\r?\n\r?\n这样既可匹配windows中的空白行,也可匹配Unix和Linux中的空白行。下面来看一个匹配http或https协议的URL的例子:

文本:The URL is http://www.mikan.com, to connect securely use https://www.mikan.cominstead.

正则表达式:https?://(\w+\.)+\w+

结果:The URL is 【http://www.mikan.com】, to connect securely use 【https://www.mikan.com】 instead.

分析:这个模式以https?开头,表示?之前的一个字符可以有,也可以没有,所以它能匹配http或https,后面部分和前一个例子一样。

二、匹配的重复次数

正则表达式里的+、*和?解决了很多问题,但是:

1)+和*匹配的字符个数没有上限。我们无法为它们将匹配的字符个数设定一个最大值。

2)+、*和?至少匹配一个或零个字符。我们无法为它们将匹配的字符个数另行设定一个最小值。

3)如果只使用*和+,我们无法把它们将匹配的字符个数设定为一个精确的数字。

正则表达式里提供了一个用来设定重复次数的语法,重复次数要用{和}字符来给出,把数值写在它们中间。

1、为重复匹配次数设定一个精确值

如果想为重复匹配次数设定一个精确的值,把那个数字写在{和}之间即可。如{4}表示它前面的那个字符(或字符集合)必须在原始文本中连续重复出现4次才算是一个匹配,如果只出现了3次,也不算是一个匹配。

如前面几篇中说到的匹配页面中颜色的例子,就可以用重复次数来匹配:#[[:xdigit:]]{6}或#[0-9a-fA-F]{6},POSIX字符在java中是#\\p{XDigit}{6}。

2、为重复匹配次数设定一个区间

{}语法还可以用来为重复匹配次数设定一个区间,也就是为重复匹配次数设定一个最小值和最大值。这种区间必须以{n, m}这样的形式给出,其中n>=m>=0。如检查日期格式是否正确(不检查日期的有效性)的正则表达式(如日期2012-08-12或2012-8-12):\d{4}-\d{1,2}-\d{1,2}。

3、匹配至少重复多少次

{}语法的最后一种用法是给出一个最小的重复次数(但不必给出最大重复次数),如{3,}表示至少重复3次。注意:{3,}中一定要有逗号,而且逗号后不能有空格。否则会出错。

来看一个例子,使用正则表达式把所有金额大于$100的金额找出来:

文本:

$25.36

$125.36

$205.0

$2500.44

$44.30

正则表达式:$\d{3,}\.\d{2}

结果:

$25.36

【$125.36】

【$205.0】

【$2500.44】

$44.30

+、*、?可以表示成重复次数:

+等价于{1,}

*等价于{0,}

?等价于{0,1}

三、防止过度匹配

?只能匹配零个或一个字符,{n}和{n,m}也有匹配重复次数的上限,但是像*、+、{n,}都没有上限值,这样有时会导致过度匹配的现象。

来看匹配一个html标签的例子

文本:

Yesterday is <b>history</b>,tomorrow is a <B>mystery</B>, but today is a <b>gift</b>.

正则表达式:<[Bb]>.*</[Bb]>

结果:

Yesterday is 【<b>history</b>,tomorrow is a <B>mystery</B>, but today is a <b>gift</b>】.

分析:<[Bb]>匹配<b>标签(不区分大小写),</[Bb]>匹配</b>标签(不区分大小写)。但结果却不是预期的那样有三个,第一个</b>标签之后,一直到最后一个</b>之间的东西全部匹配出来了。

为什么会这样呢?因为*和+都是贪婪型的元字符,它们在匹配时的行为模式是多多益善,它们会尽可能从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止。

当不需要这种贪婪行为时,可以使用这些元字符的懒惰型版本。懒惰意思是匹配尽可能少的字符,与贪婪型相反。懒惰型元字符只需要给贪婪型元字符加上一个?后缀即可。下面是贪婪型元字符的对应懒惰型版本:

*       *?

+       +?

{n,}   {n,}?

所以上面的例子中,正则表达式只需要改成<[Bb]>.*?</[Bb]>即可,结果如下:

<b>history</b>

<B>mystery</B>

<b>gift</b>

四、总结

正则表达式的真下威力体现在重复次数匹配方面。这里介绍了+、*、?几种元字符的用法,如果要精确的确定匹配次数,使用{}。元字符分贪婪型和懒惰型两种,在需要防止过度匹配的场合下,请使用懒惰型元字符来构造正则表达式。在下一篇中将会介绍位置匹配。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools./regex/javascript

正则表达式在线生成工具:
http://tools./regex/create_reg

希望本文所述对大家正则表达式学习有所帮助。


# 正则表达式  # 重复匹配  # 匹配5到10位无重复数字的正则表达式  # 正则表达式必知必会之重复匹配详细示例  # 多个  # 说到  # 都是  # 放在  # 就可以  # 第一个  # 可以用  # 这段  # 写在  # 几篇  # 是一个  # 最小值  # 也不  # 也有  # 也会  # 都在  # 将会  # 不需要  # 还会 


相关文章: 建站之星微信建站一键生成小程序+多端营销系统  代购小票制作网站有哪些,购物小票的简要说明?  成都网站制作报价公司,成都工业用气开户费用?  如何用西部建站助手快速创建专业网站?  建设网站制作价格,怎样建立自己的公司网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  韩国服务器如何优化跨境访问实现高效连接?  如何确认建站备案号应放置的具体位置?  广州建站公司哪家好?十大优质服务商推荐  家庭建站与云服务器建站,如何选择更优?  如何在云主机快速搭建网站站点?  如何高效配置IIS服务器搭建网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站之星后台密码遗忘如何找回?  建站之星24小时客服电话如何获取?  北京制作网站的公司,北京铁路集团官方网站?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何在阿里云香港服务器快速搭建网站?  建站之家VIP精选网站模板与SEO优化教程整合指南  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何在万网开始建站?分步指南解析  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在IIS服务器上快速部署高效网站?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  个人网站制作流程图片大全,个人网站如何注销?  家具网站制作软件,家具厂怎么跑业务?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  建站之星2.7模板:企业网站建设与h5定制设计专题  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何快速搭建高效WAP手机网站吸引移动用户?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何通过万网虚拟主机快速搭建网站?  内部网站制作流程,如何建立公司内部网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何正确选择百度移动适配建站域名?  如何实现建站之星域名转发设置?  建站主机核心功能解析:服务器选择与网站搭建流程指南  网站制作公司排行榜,抖音怎样做个人官方网站  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  创业网站制作流程,创业网站可靠吗?  如何获取免费开源的自助建站系统源码?  婚礼视频制作网站,学习*后期制作的网站有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  如何快速生成凡客建站的专业级图册?  山东云建站价格为何差异显著? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。