【问题标题】:Search with lazy quantifier使用惰性量词搜索
【发布时间】:2021-10-29 03:42:17
【问题描述】:

我有以下文字:

Nmap  scan report for abc.com (127.0.20.231)
...
Nmap  scan report for 123456.com (127.0.20.13)
...
Nmap  scan report for qwerty.com (127.0.20.28)
...

并希望从中获得以下信息:

abc.com
123456.com
qwerty.com

我可以在 vim 之外做,应该像 (?<=report for )(.*?)(?= ),但我不明白我如何在 vim 中做。

据我了解,它应该类似于我在非常神奇的模式下的解决方案。任何人都可以展示不同的 vim 示例吗?

【问题讨论】:

    标签: vim macvim


    【解决方案1】:

    您可以使用/report for \zs.*\ze 之类的模式来仅匹配abc.com。

    请参阅\zs 和\ze,了解如何设置匹配的开始和结束。它们比\@<= 和\@= 更直观。

    【讨论】:

      【解决方案2】:

      这里是Vim方言的直接翻译,见:help perl-patterns:

      \(report for \)\@<=\(.\)\{-}\( \)\@=/
      

      但是那个东西只是一个模式,它自己什么都不做。你想用它做什么?

      【讨论】:

      • 谢谢,它有效。没有更简单的方法吗?我只想复制将要找到的文本(知道怎么做)。
      • 我不明白你的评论。
      • 对不起;我的意思是,没有其他方法可以在 vim 中选择两个特定单词之间的文本吗?就我而言,它是“report for”和“(”之间的所有内容。您的示例有效,但看起来非常棘手。
      • “选择”是为了什么?为了拉扯?用于存储在变量中?语法高亮?用于导航?在视觉模式?你必须在这里解释你的目标。另外,我的“示例”只是您的逐字翻译,因此并不复杂。
      • 选择拉取。但我使用 CopyMatches 函数 (vim.fandom.com/wiki/Copy_search_matches) 复制选定的文本。所以,我所要做的就是标记要复制的文本。我可以选择“report for abc.com”和/\vreport for\ .*\ 稍后复制,但我真正需要选择的只是“abc.com”。
      猜你喜欢
      • 2018-01-20
      • 1970-01-01
      • 2011-08-22
      • 2013-10-07
      • 1970-01-01
      • 2012-07-11
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多