gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:08:06 24 4
gpt4 key购买 nike

我想在 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', len(a:num) - i - 1))
endif
let init .= a:num[i]
endfor
return '\%(' . join(branches, '\|') .'\)'
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, '-')
call add(branches, 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]\)\)

关于regex - Vim - 使用正则表达式按字典顺序比较字符串(以查找更早/更晚的日期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com