正则表达式反向引用乘法[重复]

Posted

技术标签:

【中文标题】正则表达式反向引用乘法[重复]【英文标题】:Regex Backeference Multiplying [duplicate] 【发布时间】:2019-05-06 16:11:01 【问题描述】:

我正在尝试学习正则表达式,我尝试解决的练习之一如下:

我有一个字符串:

    "london new york" 

我正在尝试匹配正则表达式。

模式是这样的:

    r"(..o(.)).+(\2)*"

结果是ndon new york

据我了解, (\2) 匹配 n 但什么匹配 ew york ? 还有* 中的(\2)* 有什么作用?是否尝试匹配n 或特殊字符.

【问题讨论】:

(\2)* 可以匹配一个空字符串,因为它是 * 量化的。 .+ 有效匹配整行的其余部分。 这里需要实现什么?请解释规则、你需要得到什么以及为什么。 【参考方案1】:

这样看

 (                             # (1 start)
      . . o
      ( . )                         # (2)
 )                             # (1 end)
 ( .+ )                        # (3)
 ( \2 )*                       # (4)

 **  Grp 0 -  ( pos 2 : len 13 ) 
ndon new york  
 **  Grp 1 -  ( pos 2 : len 4 ) 
ndon  
 **  Grp 2 -  ( pos 5 : len 1 ) 
n  
 **  Grp 3 -  ( pos 6 : len 9 ) 
 new york  
 **  Grp 4 -  NULL 

您可以看到第 4 组始终为空。 第 4 组始终为空,因为第 3 组占用所有air 当前行的剩余部分,从不 为可选组 4 留下任何东西。

在使用量词*+ 时仍然必须小心 捕获组。那是因为的每次迭代, 如果匹配将有助于整个匹配,但是只有 该组将保留最后一次迭代,因为它是 每次都会覆盖内容。

【讨论】:

以上是关于正则表达式反向引用乘法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 分组分组引用反向引用多选非捕获分组

正则——反向引用

Java中的正则表达式反向引用

在 sed 中使用反向引用正则表达式

正则表达式;反向引用字符集中不匹配的字符

如何在正则表达式中反向引用“内部”选择( () )?