用于匹配字符串的Vim正则表达式

时间:2014-05-09 09:15:08

标签: regex vim

如何为Vim创建一个正则表达式,以适应在一行上匹配多个双引号字符串,而不匹配两个双引号字符串之间的文本?对模式的限制是双引号字符串不能包含单引号。到目前为止,我想出了/"\([^']\{-}\)"/来匹配下面的字符串。但正如您所看到的那样,它将匹配第二行的字符串之间的文本。我不能依赖于琴弦周围的空白区域,如第三行所示。当然,它也需要与第四行一起工作。

  • "猫"被称为" foo"
  • "猫' S"名字是" foo"
  • x ="猫的食物"
  • x =" cat"

2 个答案:

答案 0 :(得分:2)

  

基本上我想从double中检索内容   引号。这样我就可以用单引号替换它们。它去了   不用说我不想替换单引号的双引号   

中有单引号时的引号

我没有找到一种方法来编写一个简单的正则表达式来满足您的需求,但是对于vim' s :s有一种方法:

%s/\v"([^"]*)"/\=stridx(submatch(1),"'")>=0?submatch(0):"'".submatch(1)."'"/g

执行上述行后,您的示例文本将更改为:

'cat' is called 'foo'
"cat's" name is 'foo'
x="cat's food"
x = 'cat'

答案 1 :(得分:1)

我不确定我在这里理解你需要什么,但是

/\("\([^"]*'[^"]*\)\)\@<!\("\([^"^']*\)"\)

匹配示例中所有使用双引号的字符串,但不匹配包含单引号的字符串。

"cat" is called "foo"   => "cat", "foo" highlighted
"cat's" name is "foo"   => "foo" highlighted
x="cat's food"          => nothing highlighted
x = "cat"               => "cat" highlighted

[这里强调的意思是:当从上面提示命令时通过vim中的正则表达式搜索找到]

这使用\@<!构造,这是vim-regex语法,用于负面观察(see vim manual here)。匹配前面没有引号和单引号的双引号。 如果单引号存在于双引号之外,则仍然存在问题。我不知道这是不是问题,请告诉我是否存在问题。