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

正则基础之——非捕获组 .

阅读更多

非捕获组:(?:Expression)

接触正则表达式不久的人,通常都会对非捕获比较迷惑,为什么要有非捕获组?作用是什么?应该在什么场景下使用?

说到非捕获组,首先要了解什么是捕获组,详细内容参考 正则基础之——捕获组(capture group 

1、为什么要有非捕获组

一旦使用了“()”,就会默认为是普通捕获组,从而将“()”内表达式匹配的内容捕获到组里。但是有些情况下,不得不用“()”,但并不关心“()”中匹配的内容是什么,后面也不会引用捕获到的内容,这带来了一个副作用,记录这些捕获组就会占用内存,降低匹配效率。

设计非捕获组的目的就是为了抵消这种副作用。 只进行分组,并不将子表达式匹配到的内容捕获到组里。

2、不得不使用(),由此可能带来副作用的情况

以下举例中只说明场景,举例比较简单,实际应用涉及到时可能会比较复杂。

a)         使用“|”表示“或”的关系时,用“()”限制范围

举例:匹配0100的数字

正则表达式:^([1-9]?[0-9]|100)$

如果不用“()”来限制“|”的范围,结果就会出错,详见“|”的解释。

b)         使用量词限定一个子表达式整体的匹配次数

举例:匹配HH:mm:ss格式时间

正则表达式:([01][0-9]|2[0-3])(:[0-5][0-9]){2}

这里的“{2}”是对前面的“:[0-5][0-9]”整体作修饰,因此要用“()”来限定修饰的范围。

当然,量词还可以是?*+{m}{m,n}{m,},以及非贪婪模式的量词等。

c)         某些时候为了使捕获组的编号可控,可能会用到非捕获组,这种应用不多,这里不赘述。

3、什么时候该用非捕获组

非捕获组主要是在涉及到效率时才考虑使用,而效率通常都是相对的,需要综合考虑。

不考虑效率的场合,可以不用非捕获组,以提高正则表达式的可读性。

一些非常简单的正则中,如果使用了非捕获组,因为要解析这种语法,反而可能会降低匹配效率。

一般在较复杂,“()”使用较多的正则表达式中可以考虑使用非捕获组,比如验证日期的正则表达式。

未使用非捕获组的正则:

^((?!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])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

由于这里的“()”都是用作分组,并不关心分组匹配到的内容,而且使用的()很多,影响匹配效率,所以这个正则表达式中可以使用非捕获组。

^(?:(?!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])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

转自:http://blog.csdn.net/lxcnn/article/details/4464908

分享到:
评论

相关推荐

    正则基础之——捕获组(capture group).rar

    正则基础之——捕获组(capture group).rar

    正则表达式之——捕获(capture group)和反向引用.rar

    正则表达式之——捕获(capture group)和反向引用.rar

    精通正则表达式~~~

    模拟命名捕获... 344 效率... 347 办法不只一种... 348 表达式编译、/o修饰符、qr/···/和效率... 348 理解“原文”副本... 355 Study函数... 359 性能测试... 360 正则表达式调试信息... 361 结语... ...

    JavaScript高级教程

    第 2 章 ECMAScript 基础...............................................9 2.1 语法..............................................9 2.2 变量..............................................10 2.3 关键字........

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

    最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难...

    editplus 代码编辑器html c++ jsp css

    【2】 正则表达式应用——数字替换—————————-Microshaoft,jiuk2k 【3】 正则表达式应用——删除每一行行尾的指定字符 【4】 正则表达式应用——替换带有半角括号的多行 【5】 正则表达式应用——删除空行...

    Editplus 3[1].0

    (技巧提示:空行仅包括空格符、制表符、回车符,且必须以这三个符号之一作为一行的开头,并且以回车符结尾,查找空行的关键是构造代表空行的正则表达式)。 直接在"查找"中输入正则表达式“^[ \t]*\n”,注意\t前有...

    EditPlus 2整理信箱的工具

    (技巧提示:空行仅包括空格符、制表符、回车符,且必须以这三个符号之一作为一行的开头,并且以回车符结尾,查找空行的关键是构造代表空行的正则表达式)。 直接在"查找"中输入正则表达式“^[ \t]*\n”,注意\t前有...

    正则表达式经典实例中文版 (美)高瓦特斯

     学习更高深的正则表达式特性中的微妙之处;  理解在不同语言中正则表达式的API、语法和行为之间的区别;  创建更好的正则表达式来满足个性化的需求。  使用8种编程语言的详细解决方案,包括一个正则表达式简明...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    javascript正则表达式参数/g与/i及/gi的使用指南

    ——————————————————————————–  后向引用 正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆...

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

    时至今日,perl已发展成为一套功能齐备的程序语言,几乎可以在任何操作系统上完成各种任务——从简单的命令行工具到web应用开发,及至生物信息学、金融数据分析等等不一而足。其他书籍可能会着重于教会你使用perl...

    php网络开发完全手册

    7.5.3 进行正则表达式的匹配——preg_ 7.5.3 match 113 7.5.4 转义正则表达式字符——preg_ 7.5.4 quote 113 7.5.5 执行正则表达式的搜索和替换 7.5.5 函数——preg_replace 114 7.5.6 通过回调函数执行正则表达式 ...

    Java开发技术大全 电子版

    10.8.2以非泛型类为父类319 10.8.3运行时类型识别320 10.8.4强制类型转换321 10.8.5继承规则322 10.9擦拭323 10.10擦拭带来的错误324 10.10.1静态成员共享问题325 10.10.2重载冲突问题325 10.10.3接口实现...

    javaSE代码实例

    第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...

    C#入门——面向对象等,代码+注释

    第4天 01异常捕获 02练习 02异常捕获 03switch-case 04while循环 06练习 07while练习与do--while 08for 循环 12continue 09乘法口诀练习 10类型转换和方法转换 11tryparse练习 13三元表达式 第5天 00随机数 05数组 ...

    JavaScript王者归来part.1 总数2

     10.4.1 RegExp对象——利用正则表达式实现全文检索   10.4.2 RegExp的实例属性   10.5 强大的正则表达式   10.5.1 分析正则表达式的局部   10.5.2 一个例子--强大的在线编辑器   10.5.3 构造新的文法--...

Global site tag (gtag.js) - Google Analytics