`

[转]正则基础之----非捕获组

 
阅读更多

非捕获组: (?:Expression)

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

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

1 、为什么要有非捕获组

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

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

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

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

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

举例:匹配 0 100 的数字

正则表达式: ^([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 )$

分享到:
评论

相关推荐

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

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

    精通正则表达式~~~

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

    正则巅峰 Regtop

    正则巅峰一个超强字符串处理工具,之所以取名叫“正则巅峰”,是因为它主要就是靠正则,将正则真正融入,无须依赖什么开发工具或者某个语言即可直接使用正则处理你手头文本数据相关的事务,真正将正则应用达到了一个...

    北斗_微惯导组合导航方法研究

    在此基础上,根据 SINS 辅助卫星信号捕获原理, 深入分析了影响信号捕获性能的主要因素,利用SINS 速度误差方程,推导了SINS 性能与信号捕获性能之间的关系;针对载体高动态运动轨迹,分析了采用不同精 度的 SINS ...

    ActionScript开发人员指南中文版

    正则表达式基础知识 正则表达式语法 对字符串使用正则表达式的方法 正则表达式示例:Wiki解析程序 第章:使用XML XML基础知识 用于处理XML的EX方法 XML对象 XMLList对象 初始化XML变量 组合和变换XML对象 遍历XML结构...

    java8集合源码分析-Notes:笔记

    捕获组和非捕获组 贪婪,勉强,独占模式 注解 JAVA8 lambda 自动装箱、自动拆箱 变长参数 内部类 枚举类 断言 Future接口,常见的线程池中的FutureTask实现等 1.1.4 多线程 [Java 多线程:多线程生成的原因(Java...

    一个基于nodejs的图片管理网站 可以按类别列出、上传图片到相应类别、新增类别。目前以一个基于CNN的车辆识别为基础。.zip

    CNN中通常使用非线性激活函数(如ReLU、sigmoid、tanh等)来引入非线性表达能力,使得网络能够学习复杂的决策边界。为了防止过拟合,CNN常采用正则化技术,如L2正则化(权重衰减)来约束模型复杂度,以及Dropout技术...

    java jdk-api-1.6 中文 chmd

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    AIC的Java课程1-6章

     理解正则表达式,学会使用String.matches方法,Pattern和Matcher类进行模式匹配。  学会使用String.split方法,Scanner类,StringTokenizer类分解字符串。  [*]利用Formatter类的printf或format...

    JAVA_API1.6文档(中文)

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     7.1.3 定义类相关的非成员函数 234  7.1.4 构造函数 235  7.1.5 拷贝、赋值和析构 239  7.2 访问控制与封装 240  7.2.1 友元 241  7.3 类的其他特性 243  7.3.1 类成员再探 243  7.3.2 返回*this的成员函数...

    Tcl_TK编程权威指南pdf

    Tcl和与之关联的图形用户界面工具包(Tk)是由加州大学的John Ousterhout教授设计并编写的。尽管它是个商用软件包,但你也可以在Internet上找到它(见第VII页),而且可以在自己的应用程序中自由使用这个软件包。Tcl解释...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     7.1.3 定义类相关的非成员函数 234  7.1.4 构造函数 235  7.1.5 拷贝、赋值和析构 239  7.2 访问控制与封装 240  7.2.1 友元 241  7.3 类的其他特性 243  7.3.1 类成员再探 243  7.3.2 返回*this的成员函数...

    Java2核心技术.part5

    12.8正则表达式 13章泛型程序设计 13.1为什么要使用泛型程序设计 13.2简单泛型类的定义 13.3泛型方法 13.4类型变量的限定 13.5泛型代码和虚拟机 13.5.1翻译泛型表达式 13.5.2翻译泛型方法 ...

    shell教程-30章,下了之后会让你大吃一惊,相当好

    18.4.5 捕获输入并执行空命令 178 18.4.6 缺省变量值 179 18.5 for循环 180 18.5.1 简单的for循环 181 18.5.2 打印字符串列表 181 18.5.3 对for循环使用ls命令 181 18.5.4 对for循环使用参数 182 18.5.5 使用for循环...

    Shell脚本学习笔记

    1.7.2 使用Linux用户组 46 1.7.3 解码文件权限 47 1.7.4 修改安全设置 49 1.8 vim编辑器 52 第2章 基本脚本编译 54 2.1 创建脚本与使用变量 54 2.1.1 创建脚本 54 2.1.2 使用变量 55 2.2 重定向输入输出与数学计算 ...

Global site tag (gtag.js) - Google Analytics