我想增加价值。例如
我想改变它。
我该如何改变?
答案 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>