【问题标题】:Vim regex for matching strings用于匹配字符串的 Vim 正则表达式
【发布时间】:2014-05-09 09:15:08
【问题描述】:

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

  • “猫”被称为“foo”
  • “猫”的名字是“foo”
  • x="猫粮"
  • x = "猫"

【问题讨论】:

  • 对于正则表达式来说这将是一项棘手的任务,例如"cat's" name is "foo" 第二个"(在's 之后)应该或不应该匹配?答案是否定的,我知道。因为cat's。但是" name is " 很好……我想你明白我的意思了。
  • 我不太明白你想要匹配的是什么。您能否为您的四个示例添加一个解释,说明您想要匹配该行的哪些部分?
  • 谢谢。我想匹配示例中的所有双引号字符串,不包括包含单引号的字符串。所以我想要“cat”、“foo”、“foo”、“cat”而不是“cat's”或“cat's food”。
  • @kodnin 等等,如果字符串不包含单引号 ',您只想匹配双引号 (") 或双引号及其包裹的字符串?你最好编辑你的问题,解释一下。例如line: xxx, what you want to get is yyyy请使用代码块。
  • @kent,基本上我想从双引号中检索内容。这样我可以用单引号替换它们。不用说,当里面有单引号的时候,我不想用双引号代替单引号。

标签: regex vim


【解决方案1】:

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

我没有找到一种方法来编写一个简单的正则表达式来满足您的需求,但是使用 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'

【讨论】:

  • 这看起来很有趣,感谢您的努力!仍然想知道这条线是否可以重构为更简单的东西。
【解决方案2】:

我不确定我是否了解您在这里需要什么,但是

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

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

"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中通过正则表达式搜索找到]

这使用了 \@&lt;! 构造,它是用于否定后视 (see vim manual here) 的 vim-regex 语法。匹配前面没有引号和单引号的双引号。 但是,如果单引号存在于双引号之外,这仍然会有问题。不知道是不是有问题,有的话请告诉我。

【讨论】:

  • 我不想要包含单引号的字符串,例如“cat's”和“cat's food”。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2023-01-30
  • 2012-06-05
  • 2013-12-25
相关资源
最近更新 更多