【问题标题】:Search in VS Code for multiple terms在 VS Code 中搜索多个术语
【发布时间】:2018-10-01 08:15:10
【问题描述】:

假设我在 VS Code 上搜索术语“word1 word2”。然后它会找到所有出现“word1”后跟“word2”的情况。实际上,我想找到 word1 和 word2 出现的所有文件,但它们不必是连续的。我该怎么做?

【问题讨论】:

    标签: regex search visual-studio-code


    【解决方案1】:

    使用正则表达式标志并搜索(word1[\s\S\n]*word2)|(word2[\s\S\n]*word1)


    基于@tonix 正则表达式做了一个小扩展:

    https://marketplace.visualstudio.com/items?itemName=usernamehw.search

    【讨论】:

    • 你也需要一些单词边界 '\b' 除非 word1 或 word2 在另一个单词中,例如 'backword1' 对你来说不是问题。而且我必须使用 \\n 让它在跨文件搜索面板中工作。
    • @Alex 你能解释一下[\s\S\n]*吗?
    • 天才! (尽管它很有用,但我不会很快学习正则表达式。)
    • 我们可以限制它,使所有单词都必须在同一行吗?更新,这似乎工作:(word1[\s\S]*word2)|(word2[\s\S]*word1)
    • @Nikhil 你在这里:\s - 匹配任何空白字符 \S - 匹配任何非空白字符 \n - 匹配换行符 [\s\S\n] - 完全匹配上述之一三个[\s\S\n]* - 匹配上述三个中的零个或多个 - 实际上,“任何长度的任何内容”。理论上\s 也应该匹配\n,但这在 VS Code 搜索字段中不起作用。
    【解决方案2】:

    这里也是满足简单需求的一种简单方法——将其用作正则表达式

    (word1)|(word2)|(word3)  
    

    它可能不涵盖某些情况,但对我来说效果很好,并且易于记住输入。

    【讨论】:

    • 这应该被标记为答案。这是迄今为止提出的最简单的工作解决方案,并且只处理问题所要求的内容。
    • 这匹配 OR。它被要求 AND。我改用Alex' answer
    • 好点,这些是不同的用例。当我想突出显示文件中的所有关键字时使用此正则表达式
    【解决方案3】:

    VSCode 有一个open issue 来支持多个搜索。你可能想上去推他们一点。

    【讨论】:

    • 现在支持这个,你可以搜索词然后在编辑器中打开并使用 ctrl + f 搜索搜索结果谢谢@pushkin
    • 刚刚为此发布了answer,因此将来会更容易,但您可能可以编辑此答案
    【解决方案4】:

    为了你们,

    如果您想在单个文件中一次搜索多个单词(超过 2 个)并且所有单词必须在文件中至少出现一次(逻辑 AND),您可以使用以下利用前瞻断言的正则表达式:

    ^(?=[\s\S\n]*(word1))(?=[\s\S\n]*(word2))(?=[\s\S\n]*(word3))(?=[\s\S\n]*(word4))[\s\S\n]*$
    

    使用此模式的全局搜索将仅返回包含word1 AND word2 AND word3 AND word4 的所有文件(例如,word4 可能出现在开头和/或@987654327 @ 可能出现在文件末尾)。

    我还编写了一个小的 Python CLI 帮助程序,它会根据您想要的模式自动为您创建正则表达式 AND(尽管手动创建正则表达式非常简单)。

    复制以下代码,将其粘贴到一个新文件中并将其保存在您机器上的某个位置(我称之为regex_and_lookahead.py)。然后使用chmod +x ./regex_and_lookahead.py 使文件可执行(重要的是,我使用的是Python 3.6,文字前缀f -> f'(?=[\s\S\\n]*({arg}))' 在以前的版本中不起作用):

    #!/usr/bin/env python
    from sys import argv
    
    args = argv[1:]
    regex = '^'
    for arg in args:
        regex += f'(?=[\s\S\\n]*({arg}))'
    regex += '[\s\S\\n]*$'
    
    print(regex)
    

    用法:

    ./regex_and_lookahead.py word1 word2 word3 word4
    

    将生成上述正则表达式。您还可以使用它来生成更复杂的正则表达式,因为每个参数都可以包含正则表达式字符!

    举个例子:

    ./regex_and_lookahead.py "pattern with space" "option1|option2" "\bword3\b" "(repeated pattern\.){6}"
    

    将生成以下正则表达式:

    ^(?=[\s\S\n]*(pattern with space))(?=[\s\S\n]*(option1|option2))(?=[\s\S\n]*(\bword3\b))(?=[\s\S\n]*((repeated pattern\.){6}))[\s\S\n]*$
    

    当且仅当所有以下条件都为真时,才会匹配文件:

    • 字符串pattern with space至少出现一次;
    • option1option2 至少出现一次;
    • 至少出现一次单词 word3 由单词边界断言分隔;
    • 字符串 repeated pattern. 至少出现一次,重复了 6 次(即:repeated pattern.repeated pattern.repeated pattern.repeated pattern.repeated pattern.repeated pattern.)。

    如您所见,天空是唯一的限制。玩得开心!

    【讨论】:

    • 您的正则表达式在 VS Code 侧边栏搜索中似乎不起作用。它对你有用吗? VS Code 侧边栏搜索使用 Rust Regex 引擎。你的正则表达式是用那种风格写的吗?
    • 它曾经在 2019 年工作。老实说,一段时间后我没有尝试使用这个正则表达式,我不知道它现在是否工作,因为 VS Code 有几个更新。你得到什么错误?
    • 我没有收到任何错误,但搜索与任何文件都不匹配,即使我的工作区中有包含搜索词的文件。我正在使用 VS Code 1.54.3。
    【解决方案5】:

    现在支持这个,你可以搜索词然后在编辑器中打开并使用 ctrl + f 搜索搜索结果谢谢@pushkin

    【讨论】:

      【解决方案6】:

      尝试Open new Search Editor command,通过命令调色板,您可以在键绑定编辑器中将其映射到您想要的任何键绑定。我映射到cmd+shift+i

      这对我很有帮助!

      还有另一种方法,在搜索编辑器中使用 up/ down 箭头键,可以让我们浏览搜索历史记录,即使这很有用

      需要一点心智来接受它相当于拥有多个搜索编辑器(IntelliJ 等提供的)但没有持久性!

      【讨论】:

      • 这并没有解决问题。该问题涉及对同一文件中包含两个单独单词的文件的单个搜索,而不是针对所有文件中两个不同单词的单独搜索结果。
      • 答案对这个问题仍然有用,因此不要删除它。
      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2011-03-12
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多