Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Vimscript:获取字符串上正则表达式的所有匹配项_Regex_Vim - Fatal编程技术网

Regex Vimscript:获取字符串上正则表达式的所有匹配项

Regex Vimscript:获取字符串上正则表达式的所有匹配项,regex,vim,Regex,Vim,在vimscript中,我们有substitute函数,它将接受标记'g'来替换所有出现的情况 有没有办法获取所有匹配字符串 例如,对于字符串'x y z',我们可以使用替换('x y z','a-z','abc','g')将其更改为abc 但是,是否有任何方法可以获取单个字符['x','y','z'] 我知道我们可以使用match()获得匹配的位置,使用matchstr()获得匹配的字符串。但是如果我想遍历所有匹配,我必须调用这两个函数,我认为这不是有效的方法 那么,在vimscript中有没

在vimscript中,我们有
substitute
函数,它将接受标记
'g'
来替换所有出现的情况

有没有办法获取所有匹配字符串

例如,对于字符串
'x y z'
,我们可以使用
替换('x y z','a-z','abc','g')
将其更改为
abc

但是,是否有任何方法可以获取单个字符
['x','y','z']

我知道我们可以使用
match()
获得匹配的位置,使用
matchstr()
获得匹配的字符串。但是如果我想遍历所有匹配,我必须调用这两个函数,我认为这不是有效的方法


那么,在vimscript中有没有有效的方法来获取字符串的所有匹配项呢?

如果可以对regexp求反以匹配不需要的内容,那么可以使用
split()
;它将删除字符串中的所有匹配项,并返回bewtween中的剩余项列表:

:echo split('x y z', ' ')
['x', 'y', 'z']

您可以使用带有子替换表达式的替换来捕获所有匹配项

let str = 'a b c'
let lst = []
call substitute(str, '[a-z]', '\=add(lst, submatch(0))', 'g')
有关更多帮助,请参阅:

:h sub-replace-expression
:h substitute
:h add()
:h submatch()

您可以捕获匹配的字符串,然后使用反向引用访问它。类似于:
substitute('xyz','([a-z]),'\1','g')
将给出
xyz
@AnuragPeshne这样,我将拥有与模式不匹配的额外内容(空间)。假设我想从
'ax bx cy'
中提取
'a','b','c'
。和
substitute('ax bx cy','([a-c]),'\1','g')
仍将为我提供不匹配的字符('x','y'和空格)。这是因为替换表达式与捕获的表达式相同。做
substitute('ax-bx-cy','\([a-c]\)[x-y],'\1','g')
会消耗'x'和'y',然后还给你'a-b-c'
substitute('ax-bx-cy','\([a-c]\)[x-y]\?,'\1','g')
会消耗`(空间)。@AnuragPeshne我理解。这意味着我必须写我关心的模式,以及我不关心的内容(在本例中是空格)的模式来剥离它。我认为这还不够方便。有了
“\v\ze(x | y | z)
,所有匹配的元素都是解决方案->
:回声映射(过滤(分割(分割字符串“\v\ze.pat”),'v:val=~“\\v^.pat”),'matchstr(v:val,\\v^.pat)
@LucHermitte这
\ze
黑客非常神奇!然而,我认为彼得的解决方案更为直观。每次,我都需要一些
split()
可以帮助我的东西,我会花时间寻找“上次我是如何进行的?”。大多数时候,我找到了另一种更简单的方法。