正则表达式的后向引用

转载 2012年07月08日 03:46:13

转自: http://deerchao.net/tutorials/regex/regex.htm


使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。


后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。难以理解?请看示例:

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b

使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:

表4.常用分组语法
分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式,只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面,也不会拥有组号。“我为什么会想要这样做?”——好问题,你觉得为什么呢?


-------------------------------------------------------------------------------------------------------------

呃……其实,组号分配还不像我刚说得那么简单:

  • 分组0对应整个正则表达式
  • 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
  • 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.

正则表达式后向引用详解

http://c.biancheng.net/cpp/html/1413.html 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进...
  • z69183787
  • z69183787
  • 2016年08月20日 22:42
  • 1273

正则表达式(后向引用和断言)

后向引用 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的...
  • hsany330
  • hsany330
  • 2015年02月05日 18:18
  • 1117

正则表达式之分组、后向引用

分组          正则表达式中的分组又称为子表达式,就是把一个正则表达式的全部或部分当做一个整体进行   处理,分成一个或多个组。其中分组是使用“()”表示的。进行分组之后“()”里面...
  • chenlei0630
  • chenlei0630
  • 2014年02月10日 14:16
  • 3410

正则表达式详解(贪婪与懒惰、前瞻与后顾、后向引用等)

之前嫌正则麻烦,一直没有深入去了解过正则,能不用的地方就不使用。 最近项目中遇到了不可避免的正则使用,所以花了点时间去了解并整理了一下,理解不一定完全准确,如有不对欢迎指出,希望对大家有所帮助。 ...
  • u013197629
  • u013197629
  • 2017年06月20日 15:45
  • 701

sed配合正则表达式应用案例

问题:利用linux正则表达式把IP取出来。 解答:[root@ianLinux ~]# ifconfig eth0|sed -n '2p' inet addr:192.168.0.199 Bca...
  • codeTZ
  • codeTZ
  • 2016年09月04日 18:38
  • 1114

正则表达式后向引用

正则表达式后向引用 正则表达式 wangfulin 2016年01月06日发布 1.7k 次浏览 ...
  • happylzs2008
  • happylzs2008
  • 2017年08月05日 16:40
  • 87

正则表达式 后向引用

正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。 对一个正则表达式模式或部分模式两边添加圆括号()可以把这部分表达式存储到一个临时缓冲区中。 所捕获的每个子匹配都按...
  • MyGameZone
  • MyGameZone
  • 2013年08月05日 18:44
  • 1762

正则表达式之分组(捕获)、后向引用

分组          正则表达式中的分组又称为子表达式,就是把一个正则表达式的全部或部分当做一个整体进行   处理,分成一个或多个组。其中分组是使用“()”表示的。进行分组之后“()”里面...
  • kiritor
  • kiritor
  • 2013年03月31日 11:48
  • 3685

正则表达式后向引用详解(扩展正则表达式功能)

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:     从左向右,以分组的左括...
  • bytxl
  • bytxl
  • 2014年08月28日 17:12
  • 1242

[跟我学正则表达式] 8. 使用后向引用

http://searun.iteye.com/blog/389186 前一章中介绍了如何使用子表达式将字符分成组。这种分组的主要用途之一是可以控制组的重复次数(在前一章中已经演示过)。本章...
  • kendyhj9999
  • kendyhj9999
  • 2014年11月12日 14:10
  • 384
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则表达式的后向引用
举报原因:
原因补充:

(最多只允许输入30个字)