递增和递减数字

Posted

技术标签:

【中文标题】递增和递减数字【英文标题】:Increment and decrements numbers 【发布时间】:2012-04-29 00:19:56 【问题描述】:

我有这个带有数字的文本:

My numbers are 04, and 0005
My numbers are 05, and 0006
My numbers are 06, and 0035
My numbers are 07, and 0007
My numbers are 08, and 0009

这是我一直用来增加或减少选择/块选择/列中数字的代码: 体育将上述文本中的最后 4 个数字加 8:

 '<,'>s/\%V\<\d\4\>/\=submatch(0)+8/g

但我今天注意到它做了一些奇怪的事情。 这是输出:

My numbers are 04, and 13
My numbers are 05, and 14
My numbers are 06, and 37 <---
My numbers are 07, and 15
My numbers are 08, and 17
它会删除前导零(如果有前导零,我想保留它们 如果没有前导零,则不要添加它们) 它将所有数字都加了 8,除了 37,它加了 2。(为什么?)

谁能帮我找到一个正则表达式来添加/减去数字 从选择(或块选择)而不丢失前导零的

注意: 我注意到 Control A + Control x 保留前导零并按照我的意愿完成工作,但是: - 我已经看到它不能用于替代命令 ('s/) - 我不知道如何添加 p.e. 200 到一个数字列表 (200 x ?)

【问题讨论】:

如果有任何帮助,我更喜​​欢做这样的事情的方式是编写一个外部过滤器(例如,在 perl 中),然后在块上使用 !/path/filter.pl。这使得问题更容易解决,并且过滤器易于重用和修改。 【参考方案1】:

前导零表示数字8-based

(0035)8 == (29)10

你可以在 vim 中测试:

:echo 0035 == 29

它将打印1(true)。


试试这个:

:%s/\(\<[0-9]\4\>\)\@=0*\([0-9]*\)/\=submatch(2)+8/

【讨论】:

"@Kev,我检查了你的正则表达式。它工作正常,但我注意到当它附加到文本字符 pe text22text 或 22text 时它不考虑数字。我必须更改为让它工作?(顺便说一句,我认为子匹配正则表达式不可能保持前导零,不是吗?)【参考方案2】:

这个?

:%s/\v[0-9]4/\=printf("%04d", substitute(submatch(0), '^0\+', '', 0)+8)/   

编辑

@Remonn,您应该在问题中提供正确的示例输入。上面的行适用于您的示例。

对于您的新要求,请查看以下行:

输入:

40
20
120
0500
230
0000000020
00000000000005000

vim 命令:

:%!awk 'if($0~/^0/)f="\%"length($0)"d";$0+=8; s=sprintf(f,$0); gsub(/ /,"0",s);else s=$0+8;print s'

将文件更改为:

48
28
128
0508
238
0000000028
00000000000005008

在我的 cmd 中,我使用了 '%',你可以选择 (v) 你想要使用的数字,然后尝试使用我的 cmd。

祝你好运

【讨论】:

谢谢肯特,不错的正则表达式。但是我注意到它也用于没有前导零的数字,前导零。如果有,我想保留前导零,如果没有,我想不添加它们(就像 C-A / C-X 一样)。 取这些数字:40, 20, 120, 0500, 230 - 上面的正则表达式给出了错误的结果。输出:48, 28, 200, 1300, 310 "@Kent 我在我的问题中谈到了一个通用的正则表达式 :) 感谢 awk。它工作正常。我会保留它。但是 awk 不会更改文本中的 @/ 数字就像kev的正则表达式一样。(顺便说一句,你们在评论前添加@Name吗?)【参考方案3】:

默认情况下,Vim 将以 0 开头的数字视为八进制。

出于这个原因,我的 .vimrc 中有这个:

set   nrformats-=octal  " Don't bother with octal, I never use it

【讨论】:

嗨,Johnsyweb,我检查了这个,但没有任何改变。

以上是关于递增和递减数字的主要内容,如果未能解决你的问题,请参考以下文章

js验证连续两位数字递增或递减和连续三位数字相同

正则判断6位数字是递增或递减

js怎样实现点击一下得到一个递增的数字,和怎样得到递减的数字

百度之星复赛T5 Valley Numer

百度之星复赛&&hdu6148

hdu 6148 Valley Numer (数位dp)