用于替换引号内空格的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