Ruby 为什么';aeee';。gsub(/(ae)*/,';r';)`结果为`“;“是吗?
我不知道如何解释下面的结果:Ruby 为什么';aeee';。gsub(/(ae)*/,';r';)`结果为`“;“是吗?,ruby,regex,Ruby,Regex,我不知道如何解释下面的结果: 'aeee'.gsub(/(ae)*/, 'r') # => "rrerer" 你得到这个结果是因为你匹配“ae”零次或多次 指针最初位于字符串的开头。“ae”匹配,因此将替换为“r”。指针现在经过刚刚匹配的字符(“ae”),移动到第二个“e”之前。这里,空字符串被匹配并替换为“r”。指针现在前进到第二个“e”之后,在第三个“e”之前,一个空字符串再次匹配并替换为“r”。指针移过最后一个“e”后,这种情况再次发生 如果它位于非捕获组中,则会得到相同的结果:
'aeee'.gsub(/(ae)*/, 'r') # => "rrerer"
你得到这个结果是因为你匹配“ae”零次或多次 指针最初位于字符串的开头。“ae”匹配,因此将替换为“r”。指针现在经过刚刚匹配的字符(“ae”),移动到第二个“e”之前。这里,空字符串被匹配并替换为“r”。指针现在前进到第二个“e”之后,在第三个“e”之前,一个空字符串再次匹配并替换为“r”。指针移过最后一个“e”后,这种情况再次发生 如果它位于非捕获组中,则会得到相同的结果:
'aeee'.gsub(/(?:ae)*/, 'r') # => "rrerer"
你得到这个结果是因为你匹配“ae”零次或多次 指针最初位于字符串的开头。“ae”匹配,因此将替换为“r”。指针现在经过刚刚匹配的字符(“ae”),移动到第二个“e”之前。这里,空字符串被匹配并替换为“r”。指针现在前进到第二个“e”之后,在第三个“e”之前,一个空字符串再次匹配并替换为“r”。指针移过最后一个“e”后,这种情况再次发生 如果它位于非捕获组中,则会得到相同的结果:
'aeee'.gsub(/(?:ae)*/, 'r') # => "rrerer"
看看你的正则表达式
(ae)*
,你在做什么
您要求匹配出现的ae
的0或1
- 第一个匹配项为零,或在开头或字符串处不说话
- 接下来,它将查找
ae
- 接下来,它不会找到
,但由于您可以使用ae
使用它,所以零宽度也会匹配*
- 下一个和下一个也是如此
|ae | e | e |
这里的|
表示匹配
看看你的正则表达式
(ae)*
,你在干什么
您要求匹配出现的ae
的0或1
- 第一个匹配项为零,或在开头或字符串处不说话
- 接下来,它将查找
ae
- 接下来,它不会找到
,但由于您可以使用ae
使用它,所以零宽度也会匹配*
- 下一个和下一个也是如此
|ae | e | e |
这里的|
表示匹配
除了其他答案,请尝试以下方法:
'aeee'.gsub(/(ae)*/, 'r<\1>') # => "r<ae>r<>er<>er<>"
'aeee'.gsub(/(ae)*/,'r')#=>“rrerer”
使用
您还可以获得捕获表达式,您可以看到,捕获是一个空字符串。除了其他答案之外,请尝试以下方法:
'aeee'.gsub(/(ae)*/, 'r<\1>') # => "r<ae>r<>er<>er<>"
'aeee'.gsub(/(ae)*/,'r')#=>“rrerer”
使用
您还可以获得捕获表达式,您可以看到,捕获是一个空字符串。您缺少对最终位置的解释(在“与最终“e”相同”之后)。谢谢,@sawa。我修正了我的答案,希望能澄清。你错过了对最终位置的解释(在“最后的‘e’相同”之后)。谢谢,@sawa。我修正并希望澄清我的答案。第一次出现并不是空的。下一个匹配不是ae
@sawa:先生,你在说什么?第一个匹配不是空的。下一场比赛不是ae
@sawa:先生,你在说什么?我真的很喜欢这种技术。事实上,它告诉我,我在回答中给出的最初解释是混乱和不正确的(如@sawa所示)。下面是一个如何扩展该技术的示例:'aefg'.gsub(/(ae)*(?=(.?)/,'r')#=>'rrfrg
。正向前瞻(?=(.?)
在捕获组2中保存匹配后的字符(或者'
,如果没有),我非常喜欢这种技术。事实上,它告诉我,我在回答中给出的最初解释是混乱和不正确的(如@sawa所示)。下面是一个如何扩展该技术的示例:'aefg'.gsub(/(ae)*(?=(.?)/,'r')#=>'rrfrg
。正向前瞻(?=(.?)
在捕获组2中保存匹配后的字符(或'
,如果没有)。