首页 > 其他分享 >正则表达式-(3)分组与引用

正则表达式-(3)分组与引用

时间:2023-02-07 22:03:05浏览次数:39  
标签:正则表达式 括号 正则 分组 引用 子组 编号

括号在正则中的功能就是用于分组。简单来理解就是,由多个元字符组成某个部分,应该被看成一个整体的时候,可以用括号括起来表示一个整体,这是括号的一个重要功能。其实用括号括起来还有另外一个作用,那就是“复用”。

一、分组与编号

括号在正则中可以用于分组,被括号括起来的部分“子表达式”会被保存成一个子组。

那分组和编号的规则是怎样的呢?其实很简单,用一句话来说就是,第几个括号就是第几个分组。这么说可能不好理解,我们来举一个例子看一下。

 

看到如上图所示的正则,将日期和时间都括号括起来。这个正则中一共有两个分组,日期是第 1 个,时间是第 2 个。

 二、不保存子组

在括号里面的会保存成子组,但有些情况下,你可能只想用括号将某些部分看成一个整体,后续不用再用它,类似这种情况,在实际使用时,是没必要保存子组的。这时我们可以在括号里面使用 ?: 不保存子组。如果正则中出现了括号,那么我们就认为,这个子表达式在后续可能会再次被引用,所以不保存子组可以提高正则的性能。除此之外呢,这么做还有一些好处,由于子组变少了,正则性能会更好,在子组计数时也更不容易出错。

 

 三、括号嵌套

在括号嵌套的情况里,我们要看某个括号里面的内容是第几个分组怎么办?只需要数左括号(开括号)是第几个,就可以确定是第几个子组。

 

日期分组编号是 1,时间分组编号是 5,年月日对应的分组编号分别是 2,3,4,时分秒的分组编号分别是 6,7,8。

  、命名分组

在一些编程语言中还提供了命名分组,命名分组格式为(?P<分组名>正则)

比如Django的路由中,命名分组示例如下:url(r'^profile/(?P<username>\w+)/$', view_func)

 五、括号嵌套

在知道了分组引用的编号 (number)后,大部分情况下,就可以使用 “反斜扛 + 编号”,即 \number 的方式来进行引用,而 JavaScript 中是通过$编号来引用的,如$1。

 六、分组引用在查找与替换中使用

前面介绍了子组和引用的基本知识,现在来看下在正则查找时如何使用分组引用。比如我们要找重复出现的单词,我们使用正则可以很方便地使“前面出现的单词再次出现”,具体要怎么操作呢?可以使用 \w+ 来表示一个单词,针对刚刚的问题,我们就可以很容易写出 (\w+) \1 这个正则表达式了。

 

和查找类似,可以使用反向引用,在得到的结果中,去拼出来我们想要的结果。还是使用刚刚日期时间的例子,我们可以很方便地将它替换成, 2020 年 05 月 10 日这样的格式。

 

 

标签:正则表达式,括号,正则,分组,引用,子组,编号
From: https://www.cnblogs.com/wsmbszyn/p/17099943.html

相关文章

  • C++中的共享指针以及循环引用
    C++中shared_ptr对象之间可以共享对象的拥有权,但是这种共享的对象引用在某些情况下可能会引发一些问题。例如,循环引用会造成两个对象之间相互引用,无法删除对象。一个循环......
  • 正则表达式&&Java应用
    正则表达式​​10分钟快速掌握正则表达式​​​​Regex测试网站​​​​正则表达式30分钟入门教程​​正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法......
  • 解决“ORA-00937: 不是单组分组函数”报错
    原SQL:selectdistincta.begin_exec_time,b.drug_code,b.drug_name,b.drug_spec,sum(b.public_retail_price*a.total_drug)as"总金额",b.public_retail_pricefromZOE......
  • C++ 引用:他是坤坤也是鸡哥
    一、前言作为一名ikun,我最喜欢的明星就是坤坤,但是坤坤又不只叫坤坤,因为他的成名之作《鸡你太美》,ikun们就经常亲切的叫他鸡哥。这个过程中,鸡哥就是我们ikun给偶像坤坤......
  • Java按值调用和引用调用
    在java中只有通过值调用,而不是通过引用调用。如果要调用一个传递值的方法,则称为按值调用。在被调用方法中完成的更改,在调用方法的外部不受影响。在java中通过值调用的......
  • JvavScript与java中的正则表达式的区别
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scripttype="text/javascript">/*1.JavaScript是部分匹......
  • 正则表达式基础
    <spanstyle="font-size:18px;">packagecn.itcast.test;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassDemo1{publicstaticvoidma......
  • 验证邮件地址的Java正则表达式
    最近写了个Java正则表达式来验证RFC5322规范的邮件地址,这个邮件地址比较复杂,对于这样一个地址:userName@domainName,它满足以下条件:对于userName1、允许使用以下所有字符作为......
  • 由Java正则表达式的灾难性回溯引发的高CPU异常:java.util.regex.Pattern$Loop.match
    问题与分析某天领导report了一个问题:线上的CPU自从上一个版本迭代后就一直处于居高不下的状况,领导看着这段时间的曲线图判断是有两条线程在不停的死循环。接到任务后去查看......
  • C++右值引用,移动语义与完美转发详解
    tags:C++Interview写在前面总结一下深入理解C++11这本书的第三章第三节,右值引用部分.文中全部代码可以参考我在GitHub上传的部分:​​Learn_C_Cpp/c++11-14/Depth_unde......