如何使用perl以数字方式缩小索引页码

时间:2015-01-14 09:18:59

标签: perl

在索引文件中,我们有主要,次要和第三行。在这些行中,我们的页码的范围如下:

nutrients in, 223-234
reproductive phase of, 115-116,

应该是

nutrients in, 223-34
reproductive phase of, 115-16,

它可能是三位数或以上......你能不能请任何人帮助我。

1 个答案:

答案 0 :(得分:3)

s/(?=(\d(?:-|(?1))\d)(?![\d-]))(\d+)\d+-\K\2//ga

我们开始寻找一个digits-digits字符串,其中两组数字的长度相同,但不消耗任何数字。这包括前瞻性查找平衡的数字组(请参阅http://perldoc.perl.org/perlfaq6.html#Can-I-use-Perl-regular-expressions-to-match-balanced-text?以获得更好的解释)和否定前瞻以确保不再有数字(因此我们不会将120-1234简化为{ {1}})并且它不像11-12-3那样我们不想尝试处理。请注意,在平衡数字之前可以有额外的数字;这使我们可以进一步简化部分简化的范围,例如120-34

一旦我们完成了这项工作,我们会尝试从第一组中找到尽可能多的数字,其中至少有一些数字剩余并且第二组中的数字开始时相同(使用反向引用{{ 1}})。 123-24用于调整替换开始的位置,以便替换可以保持为空。 \2用于使\K仅表示0-9,而不是任何其他类型的数字。