正则表达式的后向引用

转载 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)这样的语法来剥夺一个分组对组号分配的参与权.

相关文章推荐

正则表达式学习记录-后向引用

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

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

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

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

分组,即分组匹配,也称为捕获组,是正则中的一种比较重要的匹配方式。此外后向引用和分组相结合,可以写出很多复杂匹配场景的正则。...
  • dnxbjyj
  • dnxbjyj
  • 2017年04月27日 08:03
  • 1617

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

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

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

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

靓号正则表达式(前后向查找等) 和 apache正则包使用

 开源应用 正则表达式ApacheQQJDK  一般公司在开发一类对的号码时,会预留一些号码给以后升级的会员使用,比如旺旺靓号,QQ号等,采用正则表达式实现较好,通过规则引擎的后台...

分组,捕获及后向引用

-- Start 我们在 括号及后向引用 一节中了解到了括号的两种用途:分组和捕获。 分组 事实上,正在表达式还一共提供了三种结构用于分组,如下: 元字符(Meta...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则表达式的后向引用
举报原因:
原因补充:

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