我想在
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
/<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] 举报,一经查实,本站将立刻删除。