微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vim – 使用正则表达式按字典顺序比较字符串(查找更早/更晚的日期)

我想在 vim中编写一个简单的正则表达式,它会发现所有字符串在字典上都比另一个字符串小.

具体来说,我想用它来比较格式为2014-02-17的日期.这些日期是按字典顺序排序的,这就是我使用它们的原因.

我的具体用例:我正在尝试运行一个脚本,找到比今天更早的所有日期.

我也可以将这些作为数字或任何其他解决方案进行比较.

解决方法

我认为在正则表达式中无论如何都不容易这样做.为了匹配当前日期之前的任何日期,你可以使用下面的功能(有些东西是从benjifisher偷来的)

function! Convert_to_char_class(cur) 
    if a:cur =~ '[2-9]'
        return '[0-' . (a:cur-1) . ']'
    endif
    return '0'
endfunction

function! Match_number_before(num)
    let branches = []
    let init = ''
    for i in range(len(a:num))
        if a:num[i] =~ '[1-9]'
            call add(branches,init . Convert_to_char_class(a:num[i]) . repeat('\d',len(a:num) - i - 1))
        endif 
        let init .= a:num[i]
    endfor
    return '\%(' . join(branches,'\|') .'\)'
endfunction

function! Match_date_before(date)
    if a:date !~ '\v\d{4}-\d{2}-\d{2}'
        echo "invalid date"
        return
    endif

    let branches =[]

    let parts = split(a:date,'-')
    call add(branches,Match_number_before(parts[0]) . '-\d\{2}-\d\{2}')
    call add(branches,parts[0] . '-' . Match_number_before(parts[1]) . '-\d\{2}')
    call add(branches,parts[0] . '-' . parts[1] . '-' .Match_number_before(parts[2]))

    return '\%(' . join(branches,'\|') .'\)'
endfunction

在2014-02-24之前使用以下内容搜索所有比赛.

/<C-r>=Match_date_before('2014-02-24')

如果您愿意,您可以将其包装在函数中以设置搜索寄存器.

生成的2014-02-24之前的正则表达式如下.

\%(\%([0-1]\d\d\d\|200\d\|201[0-3]\)-\d\{2}-\d\{2}\|2014-\%(0[0-1]\)-\d\{2}\|2014-02-\%([0-1]\d\|2[0-3]\)\)

它不会对日期进行任何验证.它假设你是那种格式,你是约会.

传入日期后匹配的等效函数集.

function! Convert_to_char_class_after(cur) 
    if a:cur =~ '[0-7]'
        return '[' . (a:cur+1) . '-9]'
    endif
    return '9'
endfunction

function! Match_number_after(num)
    let branches = []
    let init = ''
    for i in range(len(a:num))
        if a:num[i] =~ '[0-8]'
            call add(branches,init . Convert_to_char_class_after(a:num[i]) . repeat('\d','\|') .'\)'
endfunction

function! Match_date_after(date)
    if a:date !~ '\v\d{4}-\d{2}-\d{2}'
        echo "invalid date"
        return
    endif

    let branches =[]

    let parts = split(a:date,Match_number_after(parts[0]) . '-\d\{2}-\d\{2}')
    call add(branches,parts[0] . '-' . Match_number_after(parts[1]) . '-\d\{2}')
    call add(branches,parts[0] . '-' . parts[1] . '-' .Match_number_after(parts[2]))

    return '\%(' . join(branches,'\|') .'\)'
endfunction

产生的正则表达式是

\%(\%([3-9]\d\d\d\|2[1-9]\d\d\|20[2-9]\d\|201[5-9]\)-\d\{2}-\d\{2}\|2014-\%([1-9]\d\|0[3-9]\)-\d\{2}\|2014-02-\%([3-9]\d\|2[5-9]\)\)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐