我不知道如何解释下面resut [原文]:为什么``aeee'.gsub(/(ae)* /,'r')`导致`“rrerer”`?
'aeee'.gsub(/(ae)*/, 'r') # => "rrerer"
我不知道如何解释下面resut [原文]:为什么``aeee'.gsub(/(ae)* /,'r')`导致`“rrerer”`?
'aeee'.gsub(/(ae)*/, 'r') # => "rrerer"
您获得的结果,因为你是匹配的“AE” 零或更多次。
指针最初位于字符串的开头。 “ae”匹配,因此将被替换为“r”。指针现在移过刚才匹配的字符(“ae”),在第二个“e”之前。这里空字符串匹配并替换为“r”。指针现在超前第二个“e”,在第三个“e”之前,再次匹配空字符串并替换为“r”。指针移过最后一个“e”后,会再次发生这种情况。
你会得到相同的结果,如果它是在一个非捕获组:
'aeee'.gsub(/(?:ae)*/, 'r') # => "rrerer"
看看你的正则表达式(ae)*
,你在做什么?
你问匹配零或一个发生ae
。
第一次出现是零或者什么也不说在开头或字符串。
接下来找到ae
。
接下来它没有找到ae
,但由于使用*
可以确定零宽度也是匹配的。
下一个和下一个也是如此。
|ae|e|e|
这里|
表示匹配。
除了其他的答案,试试这个:
'aeee'.gsub(/(ae)*/, 'r<\1>') # => "r<ae>r<>er<>er<>"
随着<\1>
您还可以获得逮住表达,你看,美中不足的是一个空字符串。
我真的很喜欢这种技术。事实上,它告诉我,我在答案中给出的最初解释是混乱和不正确的(正如@sawa所标记的)。下面是一个如何扩展该技术的例子:''aefg'.gsub(/(ae)*(?=(。?))/''r <,f> fr <,g> gr <,> '。积极的前瞻'(?=(。?))'在捕获组2中匹配后保存字符(如果没有则匹配'''')。 –
您错过了对最终位置的解释(在“最后的'e'”相同之后)。 – sawa
谢谢你,我明白了! – alex
谢谢,@sawa。我解决了,并希望澄清,我的答案。 –