加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:54:45 所属栏目:安全 来源:网络整理
导读:我想在 vim中编写一个简单的正则表达式,它会发现所有字符串在字典上都比另一个字符串小. 具体来说,我想用它来比较格式为2014-02-17的日期.这些日期是按字典顺序排序的,这就是我使用它们的原因. 我的具体用例:我正在尝试运行一个脚本,找到比今天更早的所有日
我想在 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 !~ 'vd{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]ddd|200d|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 !~ 'vd{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]ddd|2[1-9]dd|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]))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读