Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
用于替换引号内空格的vim regex_Regex_Vim - Fatal编程技术网

用于替换引号内空格的vim regex

用于替换引号内空格的vim regex,regex,vim,Regex,Vim,我有以下格式的文本: ERR_OUT_OF_MEM, "ERR OUT OF MEM" ERR_SOMETHING_BAD, "ERR SOMETHING BAD" 我想用下划线替换文本中引号内的所有空格: ERR_OUT_OF_MEM, "ERR_OUT_OF_MEM" ERR_SOMETHING_BAD, "ERR_SOMETHING_BAD" 我能想到的最好的正则表达式是: \("\w\+\)\@<= \(“\w\+\)\@当然有一个0长度的模式可以在一个过程中工作,但由

我有以下格式的文本:

ERR_OUT_OF_MEM, "ERR OUT OF MEM"
ERR_SOMETHING_BAD, "ERR SOMETHING BAD"
我想用下划线替换文本中引号内的所有空格:

 ERR_OUT_OF_MEM, "ERR_OUT_OF_MEM"
 ERR_SOMETHING_BAD, "ERR_SOMETHING_BAD"
我能想到的最好的正则表达式是:

\("\w\+\)\@<= 

\(“\w\+\)\@当然有一个0长度的模式可以在一个过程中工作,但由于我使用它们从来没有多大成功,我更喜欢这种方法:

:%s/\%("[^"]*"\)*\("[^"]*"\)/\=substitute(submatch(1), ' ', '_', 'g')/g
注意:为了不转换,双引号按2按2分组

foo bar "foo bar" "foo barr"
进入

编辑:正如rampion指出的,以下内容已经足够了:

%s/"[^"]*"/\=substitute(submatch(0), ' ', '_', 'g')/g

这不是一个通用的解决方案,因为它将匹配行中双引号后出现的任何空格,但它应该适用于指定格式的字符串:

s/\v(\".*)@<= /_/g
s/\v(\“*)@My提供了一个
:SubstituteInSearch
命令。使用它,您首先搜索带引号的字符串,然后仅在匹配项中执行
:substitute

/".\{-}"
:SubstituteInSearch/_/ /g

为什么不直接使用
/“[^”]*”/
模式呢?我不明白跳过最初的引号对能给你带来什么好处(用
\%(“[^”]*“\)*
)这是一个很好的观点。我被说服了,搜索不会在结束报价后,而是在开始报价后重新开始。我纠正正则表达式。谢谢。这很有效,但它也取代了我在这行末尾的空格。啊。是的,如果有尾随空格,则需要更复杂的方法。上面的Luc's应该这样做。
/".\{-}"
:SubstituteInSearch/_/ /g