【发布时间】:2010-02-24 23:22:15
【问题描述】:
在Mastering Perl 的“高级正则表达式”一章中,我有一个损坏的示例,我无法找到一个好的修复方法。这个例子可能是为了自己的利益而试图过于聪明,但也许有人可以为我解决它。里面可能有这本书的免费副本,用于修复工作。 :)
在讨论环视的部分中,我想使用否定的环视来实现带有小数部分的数字的 commifying 例程。关键是要使用负面的回顾,因为那是主题。
我愚蠢地这样做了:
$_ = '$1234.5678';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g; # $1,234.5678
(?<!\.\d) 断言(?=(?:\d\d\d)+\b) 之前的位不是小数点和数字。
愚蠢的是没有努力去打破它。通过在末尾添加另一个数字,现在有一组三位数字,前面没有小数点和一个数字:
$_ = '$1234.56789';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g; # $1,234.56,789
如果在 Perl 中lookbehinds 可以是可变宽度,这将非常容易。但他们不能。
请注意,在没有消极的后视情况下很容易做到这一点,但这不是示例的重点。有没有办法挽救这个例子?
【问题讨论】:
-
仅供参考,您在发布此内容时遗漏了
\b至(?:\d\d\d)+\b),所以我添加了它。 (我查了一下,它在书中。)不过,这只是分散注意力;它与后视问题无关。 -
啊,是的,谢谢。当我从我的电子邮件中复制并粘贴它来测试它时,某些东西将 \b 转换为 ^B 并将所有内容都搞砸了。我忘记重新添加了。
-
你可能想考虑在这个问题上给予额外的动力(尽管这本书非常周到!),因为你有多余的代表。 :) 它还可以让您获得更多关注,因为可以从首页搜索具有活跃赏金的问题。
-
@FM:问题的重点是使用
(?<!)。我不是在寻找绕过它的方法。 -
很惊讶没有人编辑标题...对措辞大笑
标签: regex perl lookbehind