regex - 克莱恩之星:为什么$ _ = “a”; s/a */e/g农产品:ee

标签 regex perl

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/

相关文章:

regex - libtool-正则表达式 : OR-concatenate options

javascript - 正则表达式提取html注释属性

perl - 我可以在 Perl 中将数组初始化为给定大小吗?

perl - 我如何使用 Perl 的 import、use、require 和 do?

Perl - 是类的对象实例吗?

python正则表达式查找外野手的名字

javascript - JavaScript 中的正则表达式,用于在字符串中找到的第一个 SUM/MIN/MAX/AVG

java - 正则表达式匹配三组数字

perl - 如何使用 Perl 的 SOAP::Lite 编辑 SOAP 信封和 header ?

perl - 所有不可打印的字符都是控制字符吗?