是否可以使用正则表达式匹配条件?

Ale*_*hov 3 regex vim

我在超级用户上发布了这个问题,我被建议在stackoverflow上发布这个问题.

我真的很喜欢vim,今天我遇到了有趣的问题,我认为可以通过regexp完成,但我无法形成正确的问题.

我有一个非常大的sql文件.它整合了许多不同的查询.文件包含以下内容:

select * from hr.employees, oe.orders, oe.order_items
select * from hr.employess, oe.orders, hr.job_history
select * from oe.customers, oe.orders, hr.employees
select * from hr.employees, hr.departments, hr.locations
Run Code Online (Sandbox Code Playgroud)

如何只选择那些只有一行匹配hr.的行?例如,上面它将是第一行和第三行.

glt*_*lts 5

当然,可以匹配这些线.此模式匹配:

^\%(\%(hr\.\)\@!.\)*hr\.\%(\%(hr\.\)\@!.\)*$
Run Code Online (Sandbox Code Playgroud)

有些人喜欢通过使用非常神奇的开关来减少反斜杠的数量\v.然后相同的模式变成了

\v^%(%(hr\.)@!.)*hr\.%(%(hr\.)@!.)*$
Run Code Online (Sandbox Code Playgroud)

(这里我使用了非捕获括号,\%(...\)但捕获括号\(...\)也可以.)

问题是:你想用这些线做什么?删除它们?

在这种情况下,您可以使用:global命令:

:g/\v^%(%(hr\.)@!.)*hr\.%(%(hr\.)@!.)*$/d
Run Code Online (Sandbox Code Playgroud)

更多信息在

  • :h :global
  • :h /\v
  • :h /\%(
  • :h /\@!