正则表达式的后向引用

转载 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:58
  • 1621

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

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

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

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

正则:后向引用文本替换

正则表达式的三部曲应该是:1、查找;2、引用匹配了的文本(后向引用);3、有选择地替换文本。 需要注意的是:大部分语言的正则表达式实现,在查找中,使用后向引用来代表一个子模式,其语法是“\数字”...
  • hsany330
  • hsany330
  • 2015-02-05 14:55:06
  • 481

正则表达式中的向后引用

 正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字...
  • super852
  • super852
  • 2005-02-24 18:06:00
  • 4325

backreference Oracle正则表达式中的反向引用

这是Oracle对正则表达式的backreference的描述 从定义中可以看到,当匹配表达式中已()的形式将一个子串包含起来,后面就可以以\?的形式来引用。\1对应第一个(),\2对应第二个......
  • wildwave
  • wildwave
  • 2014-05-30 14:21:10
  • 1391

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

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

正则表达式后向引用一例(图片路径替换)

$g_deal_record=preg_replace("#http://.*/(.*?/.jpg|.*?/.gif|.*?/.png|.*?/.bmp)#i", "common_img/$1", $...
  • ikmb
  • ikmb
  • 2010-04-16 15:57:00
  • 1084

正则表达式 替换及 后向引用

string g_description = "http://www.taoe.com.cn/images/201004/1271632834419594676.jpg"; Re...
  • ikmb
  • ikmb
  • 2010-04-21 09:10:00
  • 906

python正则表达式系列(4)——分组和后向引用

分组,即分组匹配,也称为捕获组,是正则中的一种比较重要的匹配方式。此外后向引用和分组相结合,可以写出很多复杂匹配场景的正则。...
  • dnxbjyj
  • dnxbjyj
  • 2017-04-27 08:03:14
  • 2304
收藏助手
不良信息举报
您举报文章:正则表达式的后向引用
举报原因:
原因补充:

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