首页 > 其他分享 >【正则表达式】非捕获组 (?: ... )的使用方法和必要性

【正则表达式】非捕获组 (?: ... )的使用方法和必要性

时间:2024-09-05 17:36:03浏览次数:7  
标签:... 匹配 正则表达式 捕获 vlan 必要性 123

定义

非捕获组,用 (?: ... ) 表示。这意味着它将匹配括号内的内容,但是不会将匹配的内容存储到内存中供后续引用。

这对于那些我们想要作为一个整体处理,但是又不需要单独捕获其内容的情况非常有用。

举例

假设我们有一个字符串 abc123def,并且我们想要匹配其中的数字,同时忽略其他部分。如果我们使用以下正则表达式:

(a)(bc)(123)(def)

这个表达式会捕获四个不同的组:abc123def。如果我们只是关心中间的数字 123 而不是其他部分,那么我们可以把不需要的部分放入非捕获组中:

(?:a)(?:bc)(123)(?:def)

这样只有数字 123 会被捕获。如果我们使用这个正则表达式去查找匹配项,只有 123 会被返回为捕获组。

与普通捕获组相比

当你使用普通捕获组 (...) 时,正则表达式引擎会自动存储所有捕获组的结果。如果正则表达式中有大量的捕获组,即使你并不需要所有这些结果,也会占用额外的内存和计算资源。
使用非捕获组 (?: ... ) 可以避免这种不必要的开销,提高性能。具体来说:

  1. 内存节省:

    • 正则表达式引擎需要为每个捕获组分配内存空间来存储匹配的结果。
    • 使用非捕获组 (?: ... ) 可以避免这部分内存分配,从而节省内存。
  2. 性能优化:

    • 捕获组的创建和管理涉及到额外的操作,包括存储和检索匹配结果。
    • 使用非捕获组可以减少这些操作,从而提高正则表达式的执行速度。

 

使用场景

第一次接触到这个概念的人可能会想:不需要处理那不要用()捕获不就行了吗。

但是使用非捕获组有一些好处。

 

首先,非捕获组是一个捕获组加上“?:”,那它首先有一些普通捕获组有的好处:

  1. 分组匹配:括号可以用来确保某些部分作为一个整体进行匹配。
  2. 优先级控制:括号可以用来控制匹配的优先级,特别是当有嵌套的模式时。
  3. 结构清晰性:括号可以使复杂的正则表达式更具可读性和可维护性。
  4. 重复利用:有时你可能需要在同一个表达式中多次使用相同的模式,括号可以帮助你实现这一点。

如果说2、3、4点都是一些非必要的使用情况,那么将某部分作为一个整体进行匹配在一些情况下可能是必须的。

 

比如:需求是匹配一行参数文本,捕获其出现的参数,但其中有些参数可能不存在。

{ stream: "data_stream", pcp: 1, interface: "eth0" }
{ vlan: 10, stream: "data_stream", pcp: 1, interface: "eth0" }

比如上面这两行文本,第一行就比第二行少了vlan这个参数。

这时候,先将匹配 vlan: 10 的这部分使用括号写成一个整体,然后在括号后面跟上一个问号,就可以表示这个整体模式可以存在也可以不存在:

(?:\s*vlan:\s*(?<VID>\d+),?)?

这个表达式表示:

  • 整个模式 \s*vlan:\s*(?<VID>\d+),? 是可选的。
  • 如果这个模式存在,它将匹配 vlan: 后面跟着一个或多个空白字符、一个或多个数字(这些数字被捕获为 VID)、一个可选的逗号。

 

总结一下:

如果只在这里使用普通捕获组:

  • 将这段内容作为一个整体,加上?即可表示个整体模式可以存在也可以不存在
  • 结构清晰明了

 

在非捕获组内设置了普通捕获组的写法,相比起普通捕获组:

  • 非捕获组减少了不必要的内存分配和正则表达式引擎的额外操作
  • 捕获的内容更精确,简化后续的逻辑处理

 

这样看来,这就是比较合理、高效的一种写法

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:...,匹配,正则表达式,捕获,vlan,必要性,123
From: https://www.cnblogs.com/ban-boi-making-dinner/p/18398926

相关文章

  • 利用正则表达式从字符串中提取浮点数
    在Python中,使用正则表达式可以非常方便地从字符串中提取浮点数。Python的re模块提供了正则表达式支持。下面是如何使用正则表达式提取浮点数的示例。1、问题背景在开发过程中,有时候我们需要从字符串中提取浮点数,例如从HTML代码中提取价格信息。但是,浮点数的格式可能多种多样......
  • 互联网算法备案必要性+攻略全流程详解【附件+流程】
    一、算法备案的重要性算法备案是指相关企业或组织向有关部门提交其使用的算法的相关信息,以接受监管和审查。这一举措有助于确保算法的公正性、透明性和合法性,保护用户的权益,促进数字经济的健康发展。算法备案必要性强制性例如,在推荐系统中,如果算法存在偏见或歧视,可能会导致......
  • 外包干了2年,快要废了...
    简单的说下,我大学的一个同学,毕业后我自己去了自研的公司,他去了外包,快两年了我薪资、技术各个方面都有了很大的提升,他在外包干的这两年人都要废了,技术没一点提升,学不到任何东西,一直都在点点点,其实感觉挺可惜的,毕竟我和他关系还算不错!前段时间他和我说了下,说不能在废下去了,要想......
  • 网站打开提示:”未检测到您服务器环境的sqlite3数据库扩展...“
    当网站打开时提示“未检测到您服务器环境的sqlite3数据库扩展”,这表明您的服务器上缺少SQLite3扩展,或者虽然安装了SQLite3扩展,但是PHP并未正确配置来使用它。以下是一些排查和解决这个问题的方法:1.检查SQLite3扩展是否安装首先,您需要确认SQLite3扩展是否已经安装在您......
  • 20240907_051745 python 正则表达式 常见元字符
    •.:匹配任意单个字符•\d:匹配数字(等价于[0-9])•\w:匹配字母、数字、下划线(等价于[a-zA-Z0-9_])•\s:匹配空格、制表符、换行符等空白字符•^:匹配开头•$:匹配结尾•*:匹配前面的字符零次或多次•+:匹配前面的字符一次或多次•?:匹配前面的字符零次或一次•[]:匹配方括......
  • 20240907_061745 python 正则表达式 re.match方法
    情况一从头匹配匹配成功的数据可以通过匹配的对象的group()方法获取关注一下匹配不成功的情况情况二从中间匹配......
  • 正则表达式
    什么是正则表达式:正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。正则表达式就是把人类想要查询的东西,用计算机能识别的语言表达出来的一种规则。正则表达式仅受三剑客(grep,sed,awk)命令支持,其他命无法使用        ^ //以什么开头;"^......
  • android kotlin基础复习—for while do...while
    1、新建一个文件kt:2、循环的几种用法:forwhiledo...whilefor:println("----for使用-----")valitems=listOf("apple","banana","kiwi")for(iteminitems){println(item)}for(indexinitems.indic......
  • CSP2024 to do list...
    马上CSP了,感觉得开始培养状态了。哈希练习Tarjan初步学习+刷题大模拟练习:鸭棋+猪国杀S组初赛,选择题部分,刷整卷至少3套。树状数组练习:DX视频线段树优化dp练习贪心练习,普及组重点训练2017以来的普及组真题T3T4表达式树练习数学优化枚举练习背包专......
  • Jforum论坛项目,用Jemter调发布帖子接口,响应结果返回的重定向地址为error...html,导致一
    1.Jmeter的发布帖子接口,使用Jemter代理录制工具进行录制的,发布帖子的参数和接口,都是通过录制得来,如下图,action是insertSave 2.因为需要先登录,再能进行发帖,所以根据项目的cookie保存,增加一个cookie管理器,用来自动保存登录成功后的cookie认证 3.等脚本参数都配置好了之后,......