Vim正则表达式匹配字符串

5
如何为Vim创建一个正则表达式,以匹配一行中的多个双引号字符串,而不匹配两个双引号字符串之间的文本?模式的限制是双引号字符串不能包含单引号。到目前为止,我想出了/"\([^']\{-}\)"/来匹配以下字符串。但是如你所见,它会匹配第二行字符串之间的文本。我不能依赖于字符串周围的空格,就像你在第三行看到的那样。当然,它也需要与第四行一起工作。
  • "cat"被称为"foo"
  • "cat's"名字是"foo"
  • x="cat's food"
  • x = "cat"

这对于正则表达式来说是一个棘手的任务,例如 "cat's" name is "foo",第二个 "(在 's 后面)应该匹配还是不应该匹配?答案是否定的,我知道。因为有 cat's。但是 " name is " 是可以的……我想你明白我的意思。 - Kent
我不太明白你想匹配什么。你能否解释一下你的四个例子中你想匹配哪些行的部分? - Dani Gehtdichnixan
@kodnin 等等,你是要匹配双引号("),还是包含在双引号中的字符串,只要该字符串不包含单引号'?你最好编辑你的问题,解释得更清楚些。例如:行:xxx,你想要获取的是yyyy,请使用代码块。 - Kent
@kodnin,用 " 包裹的字符串是否可以有前导空格?例如 " cat dog" - Kent
@kent 是的,那将是一个有效的字符串。 - kodnin
显示剩余2条评论
2个回答

2
基本上,我想要从双引号中检索内容。这样我就可以用单引号替换它们。不用说,在存在单引号的情况下,我不想用单引号替换双引号。
我没有找到一种简单的正则表达式来匹配您的需求,但在vim的: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'

看起来很有趣,感谢你的努力!我仍然在想这行代码是否可以重构成更简单的形式。 - kodnin

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正则表达式语法的负向回顾(请参见vim手册)。匹配不是由引号和单引号引导的双引号。 但是,如果单引号存在于双引号之外,仍然会有问题。我不知道这是否是一个问题,请让我知道。


我不想要包含单引号的字符串,比如 "cat's" 和 "cat's food"。 - kodnin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接