a*
表示零个或多个实例:对吗?
那么$_ = "a"; s/a*/e/g
为什么会产生:ee
可能的答案:它将字符串“a”替换为:“e”,并将空字符串:“”替换为:“e”。或将字母a的不存在替换为字母e或将a的“零出现”替换为an:e
好的,但是:$_ = "b"; s/a*/e/g
产生:ebe
似乎正在替换b
左侧的空字符串以及b
右侧的空字符串
好。但是,为什么它不这样做:“a
”?它为什么不替换a
左侧的空字符串,也不替换:a以及字母:a本身的空字符串,以获取:eee
?
零的出现次数与之相同:左侧的a和右侧的0!
最佳答案
您对结果为什么是"ee"
和"ebe"
的分析是完全准确的。
“/ g”修饰符使正则表达式匹配一次,然后尝试从上次匹配停止的地方再次匹配。
差异的原因(它不会替换"a"
左侧的空字符串)是因为"*"
是贪婪-它与大多数可能的字符匹配。从 perldoc perlre
:
By default, a quantified subpattern is "greedy", that is, it will match as many times as possible (given a particular starting location) while still allowing the rest of the pattern to match.
因此它匹配零个“a”,并查看它是否可以匹配更多个。由于字符串中还有更多“a”,因此它将再匹配一个。尝试搭配更多。没有?做完了因此,我们匹配第一个“a”。
然后,“/ g”使我们尝试再次匹配(从上次匹配完成后停止的位置开始),现在匹配空字符串(零个“a”)。
关于regex - 克莱恩之星:为什么$ _ = “a”; s/a */e/g农产品:ee,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855652/