【问题标题】:VIM script sort array of strings based on numbers with in the stringsVIM 脚本根据字符串中的数字对字符串数组进行排序
【发布时间】:2021-02-13 00:31:25
【问题描述】:

我正在尝试在包含字符串的 VIM 脚本中进行排序和排列,每个字符串中可能有一个数字。 我希望根据数字(和尾随字符)对数组进行排序。 数组是:

let arr = ["FUNC10B", "FUNC8", "FUNC2", "FUNC10A"]

排序后的数组应该是:

["FUNC2", "FUNC8", "FUNC10A", "FUNC10B"]

我希望sort(arr, 'n') 能完成我需要的大部分工作,但由于某种原因它没有。 我想通过我自己的函数运行它:sort(arr, 'my_sort')。 有人可以帮我实现这个功能吗! my_sort... ? 谢谢。

【问题讨论】:

  • 如果您以更一般的方式提出这个问题并用语言而不是编辑器标记它,它认为会有所帮助。有些人不用 vim 编写脚本,但可以解决这个排序问题。
  • 感谢您的建议。但是,这是我想在 vimscript 中运行的脚本,所以它不仅仅是编辑器,而是我想要使用的实际语言。

标签: arrays function sorting vim


【解决方案1】:

好的,所以经过一些尝试和错误后,我设法让下面的函数做我想做的事。 如果有人有更好的方法来做到这一点,我会很高兴听到。 我不确定为什么第二个 if 不能使用简单的 match 命令,我使用 matchlistlen 命令解决了它。 谢谢

function! My_Sort(i1, i2)
    let l:score1 = 0 
    let l:score2 = 0
    if match(a:i1 , '\d\+')
        let l:score1 = matchlist(a:i1 , '\(\d\+\)')[0]
        let chrs = matchlist(a:i1 , l:score1.'\(\S\)')
        if len(chrs)
            let chr = chrs[0]
            let chr = char2nr(substitute(chr , l:score1 , '' , 'g'))
            let l:score1 = l:score1 + chr
        endif
    endif
    if match(a:i2 , '\d\+')
        let l:score2 = matchlist(a:i2 , '\(\d\+\)')[0]
        let chrs = matchlist(a:i2 , l:score2.'\(\S\)')
        if len(chrs)
            let chr = chrs[0]
            let chr = char2nr(substitute(chr , l:score2 , '' , 'g'))
            let l:score2 = l:score2 + chr
        endif
    endif
   return l:score1 == l:score2 ? 0 : l:score1 > l:score2 ? 1 : -1       
endfunction

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多