正则表达式捕获组嵌套

时间:2015-07-01 23:57:12

标签: regex

我刚开始学习正则表达式,我已经被this lesson暂时停留了一段时间。

enter image description here

我不太明白为什么以下2不起作用。

^(.+(\d+))$

^([a-zA-Z_]+(\d+))$

2 个答案:

答案 0 :(得分:0)

两者都可以正常工作,但在嵌套组之前需要一个空格。

如果文本是例如Activity,那么正则表达式将起作用。但是您发布的链接中的示例如:Jan1987

尝试:

Jan 1987

答案 1 :(得分:0)

对于此^(.+(\d+))$
如果我们在(.+)周围放置一个捕获组 从输出中我们看到,对于.+,引擎最初匹配
整个字符串Jan 1987然后一次回溯1个字符,直到
它可以满足下一个子表达式(\d+) 它找到字符7并看到它满足表达式 它完成了它的工作,所有子表达式都得到满足,所以它就停止了。

这是贪心量词的典型行为。 有些事情可能会破坏这种行为:

  1. 在表达式中添加非贪婪的限定词?
    看起来像(.+?)。这样做不是最初匹配的 整个字符串,它一次增量匹配1个字符 每次匹配一个字符时,它会检查下一个字符以查看它是否为
    将匹配 next 子表达式\d+。既然如此,它会留下当前的子表达式.+?并继续下一个\d+ 该过程继续进行下一个子表达式等。
    任何时候它一直失败,引擎返回上一个成功的子表达式,在其先前成功的匹配位置,
    然后减少匹配位置的,然后重复整个过程 它可以一直回到第一个子表达式 进程...这称为回溯

  2. 保留贪婪的子表达式.+,但在某些点添加
    在下一个子表达式之前的已知文字字符 这些是引擎锚定的航路点,称为伪锚 它扰乱了回溯。例如,您可以添加空格字母
    就在\d+子表达式之前,例如^(.+ (\d+))$。这迫使了 从最后一个数字开始回溯,返回直到找到空格,让\d+消耗所有年份数字。

  3. 保持贪心,但减少子表达式中允许的字符 而不是使用 Dot 元字符(匹配任何字符),请指定
    一类有限的人物。

  4. 一般来说,使用 Dot 元字符,你不在乎什么是什么 那里,或者不知道那里有什么。它总是比班级快。
    但是,在使用它时,尝试在中使用伪锚的策略 以下子表达式。这将允许发动机归零,在哪里 匹配主题文本的右侧框架点。

     ^ 
     (                             # (1 start)
          ( .+ )                        # (2)
          ( \d+ )                       # (3)
     )                             # (1 end)
     $ 
    

    输出:

      **  Grp 0 -  ( pos 0 , len 8 ) 
     Jan 1987  
      **  Grp 1 -  ( pos 0 , len 8 ) 
     Jan 1987  
      **  Grp 2 -  ( pos 0 , len 7 ) 
     Jan 198  
      **  Grp 3 -  ( pos 7 , len 1 ) 
     7