在VS代码中搜索多个术语

bec*_*cko 12 regex search visual-studio-code

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

Ale*_*lex 16

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

  • 天才!(尽管它很有用,但我不会很快学习正则表达式。) (4认同)
  • 我们可以限制所有单词都在同一行吗?更新,这似乎可行:`(word1 [\ s \ S] * word2)|(word2 [\ s \ S] * word1)` (2认同)
  • @Nikhil 这里是: `\s` - 匹配任何空白字符 `\S` - 匹配任何非空白字符 `\n` - 匹配换行符 `[\s\S\n]` - 完全匹配以下之一上述三个“[\s\S\n]*” - 匹配上述三个中任何一个的零个或多个 - 也就是说,实际上,“任何长度的任何东西”。理论上,“\s”也应该匹配“\n”,但这在 VS Code 搜索字段中不起作用。 (2认同)

Amo*_*Pol 14

应用逻辑与 (?=.*word1)(?=.*word2)(?=.*word3)

应用逻辑或 (word1)|(word2)|(word3)

  • 仅当它们位于同一行时才会找到它们。不在所要求的同一文件中。 (6认同)

Kir*_*sov 12

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

(word1)|(word2)|(word3)  
Run Code Online (Sandbox Code Playgroud)

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

  • 这与 OR 匹配。要求输入“AND”。我用[亚历克斯的回答](/sf/answers/3496124061/)代替。 (9认同)

pus*_*kin 8

VSCode 有一个未解决的问题来支持多个搜索。你可能想进入那里并推动他们一点。


ton*_*nix 5

对于你们来说,

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

^(?=[\s\S\n]*(word1))(?=[\s\S\n]*(word2))(?=[\s\S\n]*(word3))(?=[\s\S\n]*(word4))[\s\S\n]*$
Run Code Online (Sandbox Code Playgroud)

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

我还编写了一个小的 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)
Run Code Online (Sandbox Code Playgroud)

用法:

./regex_and_lookahead.py word1 word2 word3 word4
Run Code Online (Sandbox Code Playgroud)

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

举个例子:

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

将生成以下正则表达式:

^(?=[\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]*$
Run Code Online (Sandbox Code Playgroud)

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

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

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