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])) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |