2016-04-03 75 views

回答

4

您获得的结果,因为你是匹配的“AE” 或更多次。

指针最初位于字符串的开头。 “ae”匹配,因此将被替换为“r”。指针现在移过刚才匹配的字符(“ae”),在第二个“e”之前。这里空字符串匹配并替换为“r”。指针现在超前第二个“e”,在第三个“e”之前,再次匹配空字符串并替换为“r”。指针移过最后一个“e”后,会再次发生这种情况。

你会得到相同的结果,如果它是在一个非捕获组:

'aeee'.gsub(/(?:ae)*/, 'r') # => "rrerer" 
+0

您错过了对最终位置的解释(在“最后的'e'”相同之后)。 – sawa

+0

谢谢你,我明白了! – alex

+1

谢谢,@sawa。我解决了,并希望澄清,我的答案。 –

1

看看你的正则表达式(ae)*,你在做什么?

你问匹配一个发生ae

  • 第一次出现是或者什么也不说在开头或字符串。

  • 接下来找到ae

  • 接下来它没有找到ae,但由于使用*可以确定零宽度也是匹配的。

  • 下一个和下一个也是如此。

|ae|e|e|这里|表示匹配。

Regex101 Demo for better understanding.

+1

我喜欢这个链接 - 它为分析正则表达式提供了很好的帮助。 – knut

+0

第一次出现不为空。下一场比赛不是'ae'。 – sawa

+0

@sawa:你在说什么先生? – 2016-04-03 17:02:37

3

除了其他的答案,试试这个:

'aeee'.gsub(/(ae)*/, 'r<\1>') # => "r<ae>r<>er<>er<>" 

随着<\1>您还可以获得逮住表达,你看,美中不足的是一个空字符串。

+0

我真的很喜欢这种技术。事实上,它告诉我,我在答案中给出的最初解释是混乱和不正确的(正如@sawa所标记的)。下面是一个如何扩展该技术的例子:''aefg'.gsub(/(ae)*(?=(。?))/''r <,f> fr <,g> gr <,> '。积极的前瞻'(?=(。?))'在捕获组2中匹配后保存字符(如果没有则匹配'''')。 –

相关问题