2

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

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1 代表分组1匹配的文本

我们也可以自己指定子表达式的组名。要指定一个子表达式的组名,需要按照以下的语法:(?<word>[regExp])或者(?'word'[regExp])。这样这个regExp 的组名就被指定为 word 了。要反向引用这个分组 捕获 的内容,就可以使用 \k<word> 或者 \k'word'

后向引用的原理是:当捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容保存在内存中以一个数字编号或者自己命名为key的组里,这样就可以通过后向引用的方式引用匹配到的内容。

例子

  1. 匹配html标签

    `/<(\S+)[^>]*>(.*?)<\/\1/`
    

    
    `/<(?<tag>\S+)[^>]*>(.*?)<\/\k<tag>/`
    

    
    `/<(?'tag'\S+)[^>]*>(.*?)<\/\k'tag'/`
    
    第一个分组匹配标签名称,第二个分组匹配标签里面的内容,比如:`<span class="name">正则表达式</span>`,第一个分组匹配`span`,第二个分组匹配`正则表达式`.
    
  2. 匹配重复的单词

    `/\b(\w+)\b\s+\1\b/`
    
    匹配重复出现的单词,比如:`go go kitty kitty test`,能够匹配到 `go go` 和 `kitty kitty`。
    
  3. 匹配连续出现两次的英文字符

    `/([a-zA-Z])\1/`
    
    匹配连续出现的单词,比如: `abaasdassdd`, 这样能够匹配 `aa`,`ss` 和 `dd`

wangfulin
6.1k 声望107 粉丝