0

我想增加价值。例如

  • 杰瑞1
  • 杰瑞2
  • 杰瑞3
  • 杰瑞4

我想改变它。

  • 杰瑞2
  • 杰瑞3
  • 杰瑞4
  • 杰瑞5

我该如何改变?

4

1 回答 1

3

不要试图对所有事情都滥用正则表达式

按照设计,正则表达式不支持 count。原因很简单:如果你想拥有它,你至少需要一种 2 型语言,而处理比 3 型(“常规”)语言要复杂得多。

详见维基百科:https ://en.wikipedia.org/wiki/Chomsky_hierarchy

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

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

以下perl 扩展正则表达式应该可以满足您的要求:

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

但本质上,只有匹配部分是正则表达式,替换是Perl,所以图灵完备。该e标志表示正确的部分应该由 Perl 评估,而不是作为正则表达式替换字符串。

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

完整的 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>
于 2012-12-15T10:46:33.230 回答