以下是我的参数:
挑战:在每台计算机的基础上,做一个正则表达式来快速解决这个问题。
这就是我所拥有的(使用#s作为分隔符):
%s#\([1-9]\|1[012]\)[- /.]\([1-9]\|[12][0-9]\|3[01]\)[- /.]\([19\|20]\d\d\)#UGLYPART \2, \3#g搜索部分工作正常,因为我在正确的位置得到\2和\3。我知道UGLYPART将使用\1,然后进行某种评估,如:
((\1)\=(1\|2\|3\|4\|5\|6\|7\|8\|9\|10\|11\|12)(January\|February\|March\|April\|May\|June\|July\|August\|September\|October\|November\|December)) 只是它会起作用。
有人有洞察力吗?我觉得我大概有90%在那里。还是我对维姆的审判要求太高了?
发布于 2012-04-11 15:33:38
我认为您可以使用-e在“行编辑”(ex)模式下使用vim。然后给它一个编辑命令的文件。
假设这些命令在date.ex中:
g/\([0-9][0-9]*\)[./-]1[./-]\([012][0-9][0-9]*\)/s//January \1, \2/
g/\([0-9][0-9]*\)[./-]2[./-]\([012][0-9][0-9]*\)/s//February \1, \2/
g/\([0-9][0-9]*\)[./-]3[./-]\([012][0-9][0-9]*\)/s//March \1, \2/
... etc ...
w
q然后调用vim作为
vim -e -S date.ex foo其中foo是您要编辑的文件。所以yoy可以有一个shell脚本来运行这个文件系统中的所有文件。
发布于 2012-04-11 16:07:02
是的,您应该使用\=,但它是以另一种方式使用的:
%s#\v([1-9]|1[012])[\- /.]([1-9]|[12][0-9]|3[01])[- /.]((19|20)\d\d)#\=strftime('%B', 28*24*60*60*submatch(1)).' '.submatch(2).', '.submatch(3)#g注意:[]是一个集合,因此您在这里编写的[19\|20]被视为1、9、\、|、2或0。您应该使用\(19\|20\)。并使用\v避免不必要的转义。
注2:我不想写一个月的清单。您可以看到,一年中的第28天是1月,28*2=56th是2月,28*3=84th是3月,直到12月,所以您可以使用strftime()函数,而时间戳0 (以秒为单位)是1月1日(不属于当前年份,但这并不重要)。但是,它将取决于语言环境:在英语中,语言环境strftime('%B', 28*24*60*60*1)将输出“一月”,但在我的系统上,它输出“Январь”。
注3:\=必须始终位于替换字符串中的第一个位置。
https://stackoverflow.com/questions/10108552
复制相似问题