Windows上的Vim Regex或文件名模式

Windows上的Vim Regex或文件名模式,regex,vim,Regex,Vim,我正试图构造一个正则表达式,该表达式与我希望在Vim中批处理的一组文件的名称相匹配,但我发现我似乎无法按预期使用\|(regex或) 具体而言,我想在当前目录中创建一个参数列表,由以下文件组成: f0148.e, f0149.e, f0150.e ... f0159.e (i.e., 12 files total) 我输入的vim命令如下所示: :arg f01\(\(4[89]\)\|\(5[0-9]\)\).e Vim完成此命令时没有任何明显的结果——没有消息,并且:args的输出保持不

我正试图构造一个正则表达式,该表达式与我希望在Vim中批处理的一组文件的名称相匹配,但我发现我似乎无法按预期使用\|(regex或)

具体而言,我想在当前目录中创建一个参数列表,由以下文件组成:

f0148.e, f0149.e, f0150.e ... f0159.e (i.e., 12 files total)
我输入的vim命令如下所示:

:arg f01\(\(4[89]\)\|\(5[0-9]\)\).e
Vim完成此命令时没有任何明显的结果——没有消息,并且:args的输出保持不变(不会生成所需的文件名列表)

如果将正则表达式拆分为:
:arg f01\(\(4[89]\)\).e
(注意:此处保留括号,如上面的完整表达式所示)
……还有

:arg f01\(\(5[0-9]\)\).e
。。。然后
:args
生成
f0148.ef0149.e
f0150.e。。。f0159.e
(根据需要)

此外,如果我在文本文件中输入上述文件名列表,并使用上述正则表达式作为搜索模式(即,
/f01\(\(4[89]\)\(5[0-9]\)\).e
),它的工作方式与所需的一样

因此,我确定交替
(\ |)
以某种方式导致表达式失败。请注意,如果相关的话,我在Windows7上使用的是Vim(因为反斜杠和管道在Windows命令提示符下都是有效的符号)

快速解决方法是使用:

:arg f014[89].e
:argadd f015[0-9].e
…但我真的很想知道如何使上述正则表达式工作

谢谢你的帮助

我可以建议:

:let file_list = filter(split(globpath('.','**'),nr2char(10)), 'v:val =~ ''f01\(\(4[89]\)\|\(5[0-9]\)\)\.e'' ')
:execute 'args ' . join(map(file_list,'fnameescape(v:val)'),' ') 
工作原理:

  • globpath('.','**')
    列出当前目录和所有子目录中的所有文件<代码>:help globpath()
  • split(…,nr2char(10))
    将列出它,因为分隔符是换行符
  • filter(…,'v:val=~''模式“”)
    筛选列表,只保留与模式匹配的项<代码>:帮助v:val。加倍单引号是在单引号字符串中转义它们
  • map(…,fnameescape())
    转义所有空格和反斜杠
  • join()
    在文件名之间添加空格
如果您想使其成为功能,可以将其放入vimrc中:

function! ArgsPattern(pat)
  let file_list = filter(split(globpath('.','**'),nr2char(10)), 'v:val =~ ''' . substitute(a:pat,"'","''",'g') . '''')
  execute 'args ' . join(map(file_list,'fnameescape(v:val)'),' ') 
endfunction
command! -nargs=+ ArgsPattern call ArgsPattern(<q-args>)

请注意,如果没有匹配项,则函数中的
execute
命令的计算结果为
:args
,因此将打印当前参数的列表。

请阅读。简而言之:高亮显示并按CTRL-K。感谢您指出这一点——而且速度也很快!!有一个小的语法错误--
文件列表
应该是
aaa
(反之亦然),但如果不是这样,则可以工作。这比我要找的要复杂一点,但我很感激你的建议和详尽的解释!这可能会在将来的其他事情中派上用场。@Mesagoma:谢谢你的反馈,你本可以建议编辑的。下次我会尽量记住建议编辑。感谢这个功能,唉,它似乎不像你发布的命令那样做——它也会进入子文件夹。另外,能够在正则表达式中包含一条路径也很好。。。但这有点走错了方向:我真正想要的是让原始正则表达式与
arg
命令一起工作(可能是通过转义正则表达式还是其他方式?),或者了解为什么
\\\
不能在这种上下文中使用。
:ArgsPattern f01\(\(4[89]\)\|\(5[0-9]\)\)\.e