Vim:在光标上测试模式的最有效方法?

Her*_*itz 5 regex vim

我在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]
Run Code Online (Sandbox Code Playgroud)

我有一些代码在光标位置测试以查看光标是否在某个日期,如果是,那么日期文本是什么,但我正在做的事情似乎有点笨拙.

有关在光标下返回日期的最有效函数的任何注释(如果没有在日期,则为空字符串)?(我会发布我的代码,但现在不会因为尴尬和(2)避免通过建议针对问题的特定方法来污染你的思想.)

谢谢你的任何提示.

fre*_*ass 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
Run Code Online (Sandbox Code Playgroud)

该函数IsOverDate()清除寄存器ab光标是内部下并存储在相应的寄存器中的文本<><>,包括括号.然后,它会从寄存器中的值ab,并将其发送给函数CheckDate()用来检查是否表达日期模式匹配(我有你的样品中根据自己并提出一些假设来构建模式).

CheckDate()仅当表达式与日期模式匹配时,该函数才返回true.该函数IsOverDate()返回光标下的日期(带括号),如果光标不在日期上,则返回空字符串.

我希望它适合.