正则表达式的捕获性分组/反向引用

文章目录

  • 分组
  • 捕获性分组和反向引用

分组

正则的分组主要通过小括号来实现,括号包裹的子表达式作为一个分组,括号后可以紧跟限定词表示重复次数。如下,小括号内包裹的 abc 便是一个分组:

// (abc)+ 表示匹配一个或多个"abc",因为字符串"abc123"含有"abc",所以匹配成功一个"abc"
/(abc)+/.test("abc123") == true

那么分组有什么用呢? 一般来说, 分组是为了表示一个整体;除此之外,还有一个作用就是用于捕获。

捕获性分组和反向引用

捕获性分组,通常由一对小括号加上子表达式组成。捕获性分组会创建反向引用,每个反向引用都由一个编号来标识,js 中主要是通过 $+编号 或者 \+编号 去引用分组的内容,如下便是一个捕获性分组的例子:

var color = "#808080";
var output = color.replace(/#(\d+)/,"$1"+"~~");// "$1"是反向引用,也可以写成 "$1~~"
// 单独访问变量$1,并输出到控制台
console.log(RegExp.$1);//808080
// 将变量output输出到控制台
console.log(output);//808080~~

说明:
以上正则表达式中的 (\d+) 表示一个捕获性分组,而 $1 则是反向引用,引用分组 (\d+) 捕获到的内容。整个正则表达式 #(\d+) 成功匹配到字符串 #808080(\d+) 分组捕获到的内容就是 808080,所以由 $1~~ 组成的替换字符串是 808080~~。因此替换后的结果是 808080~~

想要单独获取反向引用 $1 的值,可以使用表达式:RegExp.$1RegExp.$1 指向该分组 (\d+) 捕获到的内容,该分组捕获到的内容就是 808080,所以访问 RegExp.$1 获取到的内容 808080

$+编号 只能在正则表达式之外使用。

实际上,捕获性分组捕获到的内容不仅可以在正则表达式外部引用,还可以在正则表达式内部引用。

var url = "www.google.google.com";
var re = /([a-z]+)\.\1/;//匹配到 google.google
var output = url.replace(re,"$1");// 将 google.google 替换成 google
console.log(RegExp.$1);
console.log(output);

如上代码,正则式是 ([a-z]+).\1,其中的 \1 就是反向引用,引用谁?引用分组 ([a-z]+)所匹配到的内容。

我们分析下匹配过程:

  1. ([a-z]+) 匹配到位置 3 的 . 时失败了,于是成功匹配到字符串 www,接着把控制权给 \.
  2. \. 匹配 . 成功,然后把控制权给 \1
  3. \1 引用了 ([a-z]+) 匹配到的内容,也就是 www,所以就是 www 去匹配后面的字符串,w 匹配 g 失败,整个表达式匹配失败,匹配失败的位置是 0,然后从位置 1 开始第 2 次的迭代匹配;
  4. 重复上面的过程,直到第 5 次迭代匹配,从位置 4 开始匹配,([a-z]+) 成功匹配到了 google\. 成功匹配到了 .\1 这是引用 google,所以成功匹配了 google,整个正则表达式成功匹配 1 次,接着继续第 6 次迭代匹配失败,第 7 次迭代匹配也失败,最后匹配结束;
  5. 最终正则表达式成功匹配了字符串 google.google,开始位置 4,结束位置 17,([a-z]+) 匹配 google\. 匹配 .\1 匹配 google
  6. $1 引用的就是 ([a-z]+) 匹配到的内容,即 google,所以源字符串中的 google.google 被替换成 google,最后得到字符串 www.google.com,赋值给变量 output,所以最终输出变量 output 的结果就是 www.google.com

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

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

相关文章

深度学习pytorch--多层感知机(二)

多层感知机的从零开始实现获取和读取数据定义模型参数定义激活函数定义模型定义损失函数训练模型小结我们已经从上一节里了解了多层感知机的原理。下面,我们一起来动手实现一个多层感知机。首先导入实现所需的包或模块。 import torch import numpy as np获取和读取…

jwt同一会话_在会话中使用JWT

jwt同一会话这个话题已经在黑客新闻,reddit和博客上讨论了很多次。 共识是–请勿使用JWT(用于用户会话)。 而且我在很大程度上同意对JWT的典型论点 , 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。 我不会…

表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗?

为了避免一到门口就能够看到全部室内的东西,为了更好的保护家居的隐私,目前有很多人都会在玄关的位置加一个隔断,而玄关隔断什么材质好?在做玄关隔断的时候,有些人觉得做了隔断会太浪费空间了,而玄关隔断必须要做吗?…

深度学习pytorch--多层感知机(三)

使用pytorch框架实现多层感知机和实现softmax回归唯一的不同在于我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256,并使用ReLU函数作为激活函数。#模型的核心代码为:nn.Linear(num_inputs, num_hiddens),nn.ReLU(),nn.Linear(num_hiddens, num_outputs),

mysql 日期索引的使用_日期使用

mysql 日期索引的使用时区糟透了。 特别是夏令时。 我不介意像与此行为相关的编程错误那样,不停移动时钟或失去一个小时的睡眠。 更糟糕的是Java的旧日期/时间API。 Java社区通过JSR 310公开承认了这一点,该JSR 310代替了Java Date&Time API…

axure元件库 文件上传_手把手教你打造一套属于产品经理自己的元件库

之前有篇文章聊完了如何打造一套属于自己的原型图设计规范,今天咱们来聊聊如何打造一套属于自己的元件库。毕竟,每个追求效率的PM,总会拥有一个专属自己的Axure元件库,并不断打磨优化。今天就教大家一步一步创建属于自己的Axure元…

KMP算法笔记

1.KMP算法本质上就是对朴素匹配算法(BF)的一个优化,减少朴素匹配算法中不必要匹配的次数,核心代码和朴素匹配算法差不多,BF是移动字串逐个字符匹配,每次模式串(子串)匹配只移动一个字符单位,而KMP算法是每次模式串匹配…

正则表达式的非捕获性分组

非捕获性分组,通常由一对括号加上 ?: 加上子表达式组成,非捕获性分组不会创建反向引用,就好像没有括号一样。如下: var color "#808080"; var output color.replace(/#(?:\d)/,"$1""~~"); console.log(Re…

Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

如果您不知道, Spring安全性可能会限制用户可以拥有的会话数。 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只能有一个会话,或者每…

prometheus命令_Prometheus 入门

学习安装 Prometheus 监控和警报系统并编写它的查询。-- Michael Zamot(作者)Prometheus 是一个开源的监控和警报系统,它直接从目标主机上运行的代理程序中抓取指标,并将收集的样本集中存储在其服务器上。也可以使用像 collectd_exporter 这样的插件推送…

正则表达式的命名分组

语法格式&#xff1a;(?<name>…) 命名分组也是捕获性分组&#xff0c;它将匹配的字符串捕获到一个组名称或编号名称中&#xff0c;在获得匹配结果后&#xff0c;可通过分组名进行获取。 如下是一个python的命名分组的例子&#xff1a; import re data "#80808…

python--字符/文本编码解码笔记

字符/文本编码解码笔记1.字符问题编码和解码2.字节概要3.基本的编解码器编码类型史字符编码ASCII码GB2312以及其他编码UNICODE标准编码UTF-8编码4.了解编解码问题处理UnicodeEncoderError解决方法:处理UnicodeDecodeError解决方法5.修改源代码编码6.查看文件编码方式终端查看文…

neo4j cypher_Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String...

neo4j cypher最近&#xff0c;我将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double…

easyui数据表格显示复选框_【Excel技巧】使用控件一键切换实现单位元和万元随意显示...

工欲善其事&#xff0c;必先利其器。职场上亦是如此。Excel报表想要做得完美&#xff0c;首先肯定Excel要精通。做一份Excel报表&#xff0c;如果涉及到金额&#xff0c;当金额比较大&#xff0c;单位到底是用元还是万元&#xff0c;经常是大家纠结的一个问题。我们今天就来介绍…

正则表达式的固化分组

固化分组&#xff0c;又叫原子组。 语法格式&#xff1a;(?>…) 我们在使用非贪婪模式时&#xff0c;匹配过程中可能会进行多次的回溯&#xff0c;回溯越多&#xff0c;正则表达式的运行效率就越低。而固化分组就是用来减少回溯次数的。 实际上&#xff0c;固化分组 (?…

Requests库基本使用

requests库基本使用基本流程python中一个基于网络请求的模块&#xff0c;功能强大&#xff0c;简单便捷&#xff0c;效率极高&#xff0c;可以取代古老的urllib模块。作用&#xff1a;模拟浏览器向服务器发起请求。基本流程 1.指定URL2.对指定的URL发起请求(get或post)3.获取响…

tls 使用java生成_同时使用传入和传出连接时,相互TLS身份验证存在Java问题

tls 使用java生成在大多数企业环境中&#xff0c;应用程序之间的连接中使用某种形式的安全通信&#xff08;例如TLS或SSL&#xff09;。 在某些环境中&#xff0c; 相互&#xff08;双向&#xff09;身份验证也是一项非功能性要求。 有时将其称为双向SSL或双向TLS身份验证。 因…

正则表达式的环视实际应用案例

一、千位分隔符案例&#xff08;一&#xff09; 逆序环视和顺序环视结合应用。 **需求&#xff1a;**数字格式化成用 , 分隔的货币格式。 正则表达式&#xff1a;(?n)(?<\d)(?<!\.\d*)(?(\d{3})(\.|$)) 测试代码&#xff1a; double[] data new double[] { 0,…

软件工程专插本_2021年专插本部分招生专业(拟),广科/广东理工/华商/培正/松田/工商大!...

小师姐从各专插本交流群中收集到了6所院校的2021年本科插班生拟招生专业&#xff1a;广东理工学院、广东科技学院、广东财经大学华商学院、广州大学松田学院、广东培正学院、广东工商职业技术大学。ps&#xff1a;以下只是拟招生专业&#xff0c;具体还是以考试院公布的为准。另…

Requests库实战(一)---网页采集器

网页采集器User-Agent伪装完整代码功能&#xff1a;通过动态url来实现用户输入搜索关键字&#xff0c;返回搜索到的页面。User-Agent伪装 一种反爬机制。 原理&#xff1a;网站的服务器会检测对于请求的载体身份标识&#xff0c;如果检测到请求的载体身份标识为某一款浏览器&a…