我在Vim缓冲区中匹配文本时遇到问题。我的文本中有一种特定的日期形式,通常需要测试光标处的文本是否与日期模式匹配。
以下是格式化日期的一些示例,可能在同一行上的其他文本之前或之后:
<2011-10-13 Wed>
[2011-10-13 Wed]
<2011-10-13 Wed +1>
[2011-10-13 Wed +1]
<2011-10-13 Wed 10:30>
[2011-10-13 Wed 10:30]
<2011-10-13 Wed 10:30-11:30>
[2011-10-13 Wed 10:30-11:30]
<2011-10-13 Wed 10:30 +1w>
[2011-10-13 Wed 10:30 +1w]
我有一些代码在光标位置进行测试,以查看光标是否在某个日期,如果是,那么日期文本是什么,但我正在做的事情看起来有些笨拙。
有关在光标下返回日期的最有效函数的任何注释(如果不在日期,则为空字符串)? (我会发布我的代码,但现在不会因为尴尬和(2)避免通过建议针对问题的特定方法来污染你的思想。)
感谢您的任何提示。
答案 0 :(得分:5)
function! CheckDate(expr)
let date_pattern = '[\[<]' " The first < or [
\.'\d\{4\}-\d\{2\}-\d\{2\}' " YYYY-MM-DD
\.' \(Mon\|Tue\|Wed\|Thu\|Fri\|Sat\|Sun\)' " Week day
\.'\( \d\{2\}:\d\{2\}\(-\d\{2\}:\d\{2\}\)\?\)\?'
" Optional time or range
\.'\( +\dw\?\)\?' " Optional + digit with optional 'w'
\.'\([\]>]\)' " The closing > or ]
return match(a:expr, date_pattern) != -1
endfunction
function! IsOverDate()
call setreg('a','')
call setreg('b','')
normal! "aya>
let expr1 = getreg('a')
normal! "bya]
let expr2 = getreg('b')
if CheckDate(expr1)
return expr1
elseif CheckDate(expr2)
return expr2
endif
return ''
endfunction
函数IsOverDate()
清除寄存器a
和b
,并在相应的寄存器中存储光标下的文本<
和>
以及<
和>
,包括括号。然后,它从寄存器a
和b
获取值并将其发送到函数CheckDate()
,该函数检查表达式是否与日期模式匹配(我已将自己基于您的样本并制作一些假设来构建模式)。
仅当表达式与日期模式匹配时,CheckDate()
函数才返回true。函数IsOverDate()
返回光标下的日期(带括号),如果光标不在日期上,则返回空字符串。
我希望它适合。