使用Regex增加1的整数值

时间:2012-12-15 10:36:40

标签: regex

我想增加价值。例如

  • Jerry1
  • Jerry2
  • Jerry3
  • Jerry4

我想改变它。

  • Jerry2
  • Jerry3
  • Jerry4
  • Jerry5

我该如何改变?

1 个答案:

答案 0 :(得分:3)

请勿尝试滥用正则表达式

根据设计,正则表达式意味着不支持计数。原因很简单:如果你想拥有它,你至少需要一种2型语言,而处理明显比3型(“常规”)语言复杂。

有关详细信息,请参阅维基百科:https://en.wikipedia.org/wiki/Chomsky_hierarchy

因此,根据定义,一旦你完全支持计数,它可能不再是常规语言。

有一些扩展,例如perl扩展正则表达式,可以解决这个特殊问题。但实质上,它们不再是正则表达式,而是调用外部函数来完成工作。

以下 perl扩展正则表达式应该执行您想要的操作:

s/(-?\d+)/$1 + 1/eg

但实际上,只有匹配的部分是正则表达式,替换是Perl,因此turing完成。 e标志表示应该通过Perl评估正确的部分,而不是regexp替换字符串。

当然,您可以在几乎任何其他正则表达式引擎中执行此操作。匹配,然后计算增量,然后用新值替换匹配。

完整的perl过滤器演示:

> echo 'Test 123 test 0 Banana9 -17 3 route66' | perl -pe 's/(-?\d+)/$1+1/eg'
Test 124 test 1 Banana10 -16 4 route67

p标志使perl读取标准输入并将程序应用于每一行,然后输出结果。这就是为什么实际的脚本只包含替换。这就是Perl在unix脚本中如此受欢迎的原因。您甚至可以将此过滤器批量应用于整个文件集(有关就地修改的信息,请参阅-i,以及perlrun手册页)。因此,为了修改一整套文件(备份将以.bak为后缀):

perl -p -i .bak -e 's/(-?\d+)/$1+1/eg' <filenames>