`
xuedong
  • 浏览: 296817 次
  • 性别: 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)和反向引用是两个非常重要的概念,它们能帮助我们更加精确地控制匹配规则。 首先,我们来了解捕获组。捕获组是通过圆括号 "(...)" 来定义的,它允许我们将一个正则表达式的...

    正则基础之——NFA引擎匹配原理[参照].pdf

    正则基础之——NFA引擎匹配原理 在正则表达式中,了解引擎匹配原理是非常重要的。就像音乐家一样,一个人可以演奏出动听的乐曲,但是如果不知道如何去改变音符的组合,乐曲就不会变得更动听。同样,在使用正则...

    python专题——正则表达式借鉴.pdf

    例如:<H1>Chapter 1 - 介绍正则表达式</H1> 贪婪模式匹配结果:<H1>Chapter 1 - 介绍正则表达式</H1> 非贪婪:如果您只需要匹配开始和介绍H1 标记,下面的非贪婪表达式只匹配。 5. 定位符:定位符能够将正则表达式...

    精通正则表达式~~~

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

    【python】——正则表达式(csdn)————程序.pdf

    在Python编程中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许我们进行复杂的文本匹配和操作。在Python中,正则表达式的功能是通过`re`模块提供的。下面将详细介绍正则表达式的一些核心概念和...

    PHP网站实例开发源码——HMJ采集器.rar

    【PHP网站实例开发源码——HMJ采集器.rar】是一个包含PHP编程语言的网站应用实例,主要用于实现数据采集功能。这个实例源码是HMJ采集器的版本1.31,构建日期为2006年03月28日。通过这个压缩包,开发者可以学习到PHP...

    Android源码——名片识别源码.zip

    本项目“Android源码——名片识别源码.zip”提供了一个实现这一功能的实例,让我们来深入探讨其中涉及的关键技术点。 首先,我们需要理解Android应用的基本结构。在Android开发中,一个应用程序通常包含以下几个...

    安卓Android源码——高仿QQ登陆.zip

    "安卓Android源码——高仿QQ登陆.zip"是一个针对Android平台的源码项目,旨在帮助开发者学习和模仿QQ登录界面的设计与实现。这个压缩包包含了TestLogin模块,我们可以从中抽取出一系列关于Android开发的知识点。 1....

    C语言课程设计报告——教务管理系统.docx

    【C语言课程设计报告——教务管理系统】 本项目是一个基于C语言开发的教务管理系统,主要功能包括身份验证、学生信息管理以及系统交互等。在系统中,有两类用户:普通用户(学生)和管理员,他们具有不同的权限。...

    python专题——正则表达式[整理].pdf

    : )` 创建非捕获组,避免保存匹配项到缓冲区。 7. **反向引用**: - `\1`、`\2` 等表示对之前捕获的子匹配进行引用,用于构建复杂的模式。 8. **Python的正则表达式扩展**: - `(?P<name> )`:命名组,可以在...

    易语言源码正则表达式对象类模块源码.rar

    在本压缩包“易语言源码正则表达式对象类模块源码.rar”中,包含了易语言的一个核心组件——正则表达式对象类模块的源码,以及一个名为“源码使用说明.txt”的文件,旨在帮助用户理解和使用这个模块。 正则表达式...

    正则表达式系统教程——学习正则的最简单的教程

    通过"( )"将部分表达式括起来,我们可以创建一个捕获组,这个组内的匹配结果可以在后续表达式中引用。反向引用来实现复杂的匹配,例如,"(.)\1"会匹配任何连续重复的两个字符。 正则表达式还可以通过或操作符"|"来...

    Java正则表达式——知识积累

    Java正则表达式是编程语言Java中的一个强大工具,用于处理字符串模式匹配和搜索替换。在Java中,正则表达式被广泛应用于数据验证、文本提取、文本替换等多个场景。这篇博文将深入探讨Java正则表达式的使用和相关API...

    正则表达式——详细讲解平衡组

    在正则表达式中,“平衡组”是处理复杂模式匹配的关键技术之一,尤其在需要匹配嵌套结构时。 首先,我们需要了解正则表达式的基本概念。正则表达式中的匹配原理主要是基于非确定有限自动机(NFA)引擎,它通过有限...

    Python正则表达式re模块简明笔记.docx

    #### Python中的正则表达式模块——re模块 在Python中,处理正则表达式的标准库是`re`模块。该模块提供了丰富的功能来创建和操作正则表达式,包括模式的编译、搜索、替换等。 ##### re模块的核心概念与功能 - **...

    javascript正则表达式中分组详解_.docx

    本文将详细介绍两种类型的分组——捕获性分组和非捕获性分组。 ##### 捕获性分组 捕获性分组是通过圆括号 `()` 创建的基本分组类型。当正则表达式成功匹配时,这些分组内的文本会被捕获并存储在一个临时的结果列表...

    P神经网络的非线性系统建模——非线性函数拟合.7z

    这些非线性激活函数使得网络能够捕获输入变量之间的非线性交互。 在实际应用中,我们还需要考虑过拟合和欠拟合的问题。过拟合是指模型过于复杂,对训练数据拟合得过于紧密,导致在未见过的新数据上的表现不佳。欠...

Global site tag (gtag.js) - Google Analytics