首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用VIM正则表达式将MM/DD/YYYY转换为适当日期(“1999年6月4日”)以供最终用户使用

使用VIM正则表达式将MM/DD/YYYY转换为适当日期(“1999年6月4日”)以供最终用户使用
EN

Stack Overflow用户
提问于 2012-04-11 14:56:51
回答 2查看 2.1K关注 0票数 2

以下是我的参数:

  • I需要将MM/DD/YYYY (MM-DD-YYYY,MM.DD.YYYY等)更改为月、日年份。例:2001年1月29日=>。
  • ,这将是人类的阅读输出。我需要在几台电脑上做很多次的改变。之前负责这件事的人一直是用手做的。
  • 我可以依赖VIM (因为它在一个拇指驱动器上),但是当我到达它的时候,计算机上就没有其他东西了。

挑战:在每台计算机的基础上,做一个正则表达式来快速解决这个问题。

这就是我所拥有的(使用#s作为分隔符):

代码语言:javascript
运行
复制
%s#\([1-9]\|1[012]\)[- /.]\([1-9]\|[12][0-9]\|3[01]\)[- /.]\([19\|20]\d\d\)#UGLYPART \2, \3#g

搜索部分工作正常,因为我在正确的位置得到\2和\3。我知道UGLYPART将使用\1,然后进行某种评估,如:

代码语言:javascript
运行
复制
((\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%在那里。还是我对维姆的审判要求太高了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 15:33:38

我认为您可以使用-e在“行编辑”(ex)模式下使用vim。然后给它一个编辑命令的文件

假设这些命令在date.ex中:

代码语言:javascript
运行
复制
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作为

代码语言:javascript
运行
复制
vim -e -S date.ex foo

其中foo是您要编辑的文件。所以yoy可以有一个shell脚本来运行这个文件系统中的所有文件。

票数 1
EN

Stack Overflow用户

发布于 2012-04-11 16:07:02

是的,您应该使用\=,但它是以另一种方式使用的:

代码语言:javascript
运行
复制
%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]被视为19\|20。您应该使用\(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:\=必须始终位于替换字符串中的第一个位置。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10108552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档