正则表达式 - 命名捕获组

什么是命名捕获组?

命名捕获组 是正则表达式中用于将匹配的子表达式存储到一个带名字的组中,而不是仅仅使用数字索引(如 \1, \2)来引用。这种方式让匹配结果更具可读性和可维护性。

语法

不同语言的命名捕获组语法稍有差异:

  1. Python / Golang / 某些其他语言(支持 PCRE 标准):
(?P<name>pattern)
  • name 是捕获组的名字。
  • pattern 是该捕获组要匹配的正则表达式。
  1. JavaScript (ECMAScript 2018+):
(?<name>pattern)
  • Node.js 和现代浏览器支持这种语法。
  1. .NET:
(?<name>pattern)

(?'name'pattern)

为什么使用命名捕获组?

1. 提高可读性

普通捕获组(用索引访问)可能让代码难以理解:


const regex = /(\S+)\s+(\S+)\s+(\d+)/;
const match = "hello world 42".match(regex);
console.log(match[1]); // hello
console.log(match[2]); // world
console.log(match[3]); // 42

你需要记住数字索引的意义。

命名捕获组则更直观:

const regex = /(?<greeting>\S+)\s+(?<target>\S+)\s+(?<number>\d+)/;
const match = "hello world 42".match(regex);
console.log(match.groups.greeting); // hello
console.log(match.groups.target);   // world
console.log(match.groups.number);   // 42
2. 更易于维护

当正则表达式变得复杂时,命名捕获组使代码更清晰。如果需要重构,捕获组的名字会更易于理解。

3. 灵活的结果处理

命名捕获组允许将匹配的值直接映射到对象或字典结构中,方便处理。


如何使用命名捕获组?

1. JavaScript

现代 JavaScript 中的命名捕获组通过 groups 对象访问:

const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = "2025-01-23".match(regex);if (match && match.groups) {console.log(match.groups.year);  // 2025console.log(match.groups.month); // 01console.log(match.groups.day);   // 23
}
2. Golang

Golang 使用 regexp 包,SubexpNames 提供命名捕获组的名字:

package mainimport ("fmt""regexp"
)func main() {pattern := `(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`text := "2025-01-23"re := regexp.MustCompile(pattern)match := re.FindStringSubmatch(text)if match != nil {names := re.SubexpNames()for i, value := range match {if i != 0 {fmt.Printf("%s: %s\n", names[i], value)}}} else {fmt.Println("No match found")}
}
3. Python

Python 使用 re 模块,可以通过 groupdict() 方法获取命名捕获组:

import repattern = r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})"
text = "2025-01-23"match = re.match(pattern, text)
if match:print(match.group("year"))  # 2025print(match.group("month")) # 01print(match.group("day"))   # 23print(match.groupdict())    # {'year': '2025', 'month': '01', 'day': '23'}
4. .NET (C#)

.NET 中可以通过 Groups 和 Name 属性访问命名捕获组:

using System;
using System.Text.RegularExpressions;class Program {static void Main() {string pattern = @"(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})";string text = "2025-01-23";var match = Regex.Match(text, pattern);if (match.Success) {Console.WriteLine(match.Groups["year"].Value);  // 2025Console.WriteLine(match.Groups["month"].Value); // 01Console.WriteLine(match.Groups["day"].Value);   // 23}}
}

命名捕获组的限制

  1. 语法兼容性
    • 并非所有正则引擎都支持命名捕获组。老版本的 JavaScript (Node.js < 10) 和部分嵌入式语言可能不支持。
  2. 性能
    • 在复杂的正则表达式中,使用命名捕获组可能会略微增加解析时间,但通常可以忽略不计。
  3. 组名冲突
    • 捕获组的名字必须唯一,否则会导致冲突。

总结

命名捕获组 是一种现代且高效的正则表达式语法,使得匹配结果更具可读性和维护性。无论是在 JavaScript、Golang、Python 还是其他语言中,它都极大地简化了正则表达式的使用。

如果你需要处理复杂的数据匹配或操作,优先使用命名捕获组是一个好习惯!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8063.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis入门

Mybatis入门 一、mybatis的快速入门 1、创建springboot项目 直接选择必须的依赖&#xff1a;MyBatis Framework和MySQL Driver在项目下创建pojo包&#xff0c;用来存放数据库表对应的实体类 2、配置连接信息 在springboot项目的配置文件中application.properties写入一下信…

消息队列篇--通信协议篇--MQTT(通配式主题,消息服务质量Qos,EMQX的Broker,MqttClient示例,MQTT报文等)

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议。它基于发布/订阅模式&#xff0c;专为低带宽、高延迟或不可靠网络设计。它主要用于物联网&#xff08;IoT&#xff09;设备之间的通信&#xff0c;但也广泛应用于其他需要高效消息传递…

dmfldr实战

dmfldr实战 本文使用达梦的快速装载工具&#xff0c;对测试表进行数据导入导出。 新建测试表 create table “BENCHMARK”.“TEST_FLDR” ( “uid” INTEGER identity(1, 1) not null , “name” VARCHAR(24), “begin_date” TIMESTAMP(0), “amount” DECIMAL(6, 2), prim…

基于OSAL的嵌入式裸机事件驱动框架——消息队列osal_msg

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 消息队列 消息分为hdr和bdy&#xff0c;把消息的头dhr和内容bdy做了一个分离的设计 dhr包括指向下一个消息的指针next&#xff0c;len在创建消息的时候使用&#xff0c;dest_id即目标任务&#xff0c;将消息和任务…

关于MySQL InnoDB存储引擎的一些认识

文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的&#xff1f;1.1 MySQL的存储引擎有哪些&#xff1f;1.2 MyIsam和InnoDB有什么区别&#xff1f; 2.MySQL表的结构是什么&#xff1f;2.1 行结构是什么样呢&#xff1f;2.1.1 NULL列表&#xff1f;2.1.2 char和varc…

单相可控整流电路——单相桥式全控整流电路

以下是关于单相桥式整流电路的介绍&#xff1a; 电路构成&#xff08;带阻性负载的工作情况&#xff09; - 二极管&#xff1a;是电路0的核心元件&#xff0c;通常采用四个同型号或根据需求选择不同型号的二极管&#xff0c;如1N4001、1N4007等&#xff0c;如图Vt1和Vt4是一对…

Linux(Centos、Ubuntu) 系统安装jenkins服务

该文章手把手演示在Linux系统下如何安装jenkins服务、并自定义jenkins数据文件位置、以及jenkins如何设置国内镜像源加速&#xff0c;解决插件下载失败问题 安装方式&#xff1a;war包安装 阿里云提供的war下载源地址&#xff1a;https://mirrors.aliyun.com/jenkins/war/?s…

力扣算法题——11.盛最多水的容器

目录 &#x1f495;1.题目 &#x1f495;2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 &#x1f495;3.代码实现 &#x1f495;4.完结 二十七步也能走完逆流河吗 &#x1f495;1.题目 &#x1f495;2.解析思路…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】 1.3 广播机制:维度自动扩展的黑魔法

1.3 《广播机制&#xff1a;维度自动扩展的黑魔法》 前言 NumPy 的广播机制是 Python 科学计算中最强大的工具之一&#xff0c;它允许不同形状的数组进行运算&#xff0c;而无需显式地扩展数组的维度。这一机制在实际编程中非常有用&#xff0c;但初学者往往对其感到困惑。在…

Semantic Kernel - Kernel理解

目录 一、关于Kernel 二、案例实战 三、运行截图 一、关于Kernel 微软的 Semantic Kernel 项目中,Semantic Kernel 是一个工具框架,旨在使得开发人员能够更容易地将大语言模型(如GPT)集成到不同的应用中。它通过提供一组接口、任务模板和集成模块,使开发者能够轻松地设计…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…

openlayer getLayerById 根据id获取layer图层

背景&#xff1a; 在项目中使用getLayerById获取图层&#xff0c;这个getLayerById()方法不是openlayer官方文档自带的&#xff0c;而是自己封装的一个方法&#xff0c;这个封装的方法的思路是&#xff1a;遍历所有的layer&#xff0c;根据唯一标识【可能是id&#xff0c;也可能…

Qt 控件与布局管理

1. Qt 控件的父子继承关系 在 Qt 中&#xff0c;继承自 QWidget 的类&#xff0c;通常会在构造函数中接收一个 parent 参数。 这个参数用于指定当前空间的父控件&#xff0c;从而建立控件间的父子关系。 当一个控件被设置为另一控件的子控件时&#xff0c;它会自动成为该父控…

SOME/IP--协议英文原文讲解1

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 一、SOM…

Ansible自动化运维实战--script、unarchive和shell模块(6/8)

文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件&#xff0c;其提供了一…

【模型】RNN模型详解

1. 模型架构 RNN&#xff08;Recurrent Neural Network&#xff09;是一种具有循环结构的神经网络&#xff0c;它能够处理序列数据。与传统的前馈神经网络不同&#xff0c;RNN通过将当前时刻的输出与前一时刻的状态&#xff08;或隐藏层&#xff09;作为输入传递到下一个时刻&…

《FreqMamba: 从频率角度审视图像去雨问题》学习笔记

paper&#xff1a;FreqMamba: Viewing Mamba from a Frequency Perspective for Image Deraining GitHub&#xff1a;GitHub - aSleepyTree/FreqMamba 目录 摘要 1、介绍 2、相关工作 2.1 图像去雨 2.2 频率分析 2.3 状态空间模型 3、方法 3.1 动机 3.2 预备知识 3…

iic、spi以及uart

何为总线&#xff1f; 连接多个部件的信息传输线&#xff0c;是部件共享的传输介质 总线的作用&#xff1f; 实现数据传输&#xff0c;即模块之间的通信 总线如何分类&#xff1f; 根据总线连接的外设属于内部外设还是外部外设将总线可以分为片内总线和片外总线 可分为数…

Android WebView 中网页被劫持的原因及解决方案

文章目录 一、原因分析二、解决方案一览三、解决方案代码案例3.1 使用 HTTPS3.2 验证 URL3.3 禁用 JavaScript3.4 使用安全的 WebView 设置3.5 监控网络请求3.6 使用安全的 DNS 四、案例深入分析4.1 问题4.2 分析 五、结论 在 Android 应用开发中&#xff0c;WebView 是一个常用…