【发布时间】:2014-01-11 17:47:39
【问题描述】:
我有一个正则表达式,它在sed 中给出了一个结果,但在 Perl(和 Ruby)中给出了另一个结果。
我有字符串one;two;;three,我想突出显示由; 分隔的子字符串。所以我在 Perl 中执行以下操作:
$a = "one;two;;three";
$a =~ s/([^;]*)/[\1]/g;
print $a;
(或者,在 Ruby 中:print "one;two;;three".gsub(/([^;]*)/, "[\\1]")。)
结果是:
[one][];[two][];[];[three][]
(我知道虚假空子字符串的原因。)
奇怪的是,当我在 sed 中运行相同的正则表达式时,我得到了不同的结果。我跑:
echo "one;two;;three" | sed -e 's/[^;]*/[\0]/g'
我得到:
[one];[two];[];[three]
造成这种不同结果的原因是什么?
编辑:
有人回答“因为sed 不是perl”。我知道。我问这个问题的原因是因为我不明白 sed 如何很好地应对零长度匹配。
【问题讨论】:
-
sed不能“应付 ... 零长度匹配” - 它以一种恰好满足您需要的方式出错。改写join ';', map "[$_]", split /;/, $str,不要使用a作为标识符。 -
由于我对 perl 和 ruby 缺乏了解,我无法回答这个问题。然而,这是一个很好的问题。只是被问到的方式不对... +1 无论如何...等待了解 perl/ruby 如何处理
greedy匹配。 -
@NiccoloM。你是说读 Perl 标签的人思想不开放?这是多么不公平和不合理的话。
-
@TLP:我把它理解为“不通常使用 perl,但看到带有
[perl]标记的内容的人可能仅根据标签。” -
@mirabilos:
$a和$b被 perl 用于排序:perldoc.perl.org/functions/sort.html 避免在其他上下文中使用它们只是一种好的 perl 做法。