Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么';aeee';。gsub(/(ae)*/,';r';)`结果为`“;“是吗?_Ruby_Regex - Fatal编程技术网

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中保存匹配后的字符(或
'
,如果没有)。