Search in VS Code for multiple terms

前端 未结 4 1371
再見小時候
再見小時候 2020-12-14 16:51

Suppose I search on VS Code the terms \'word1 word2\'. Then it finds all the occurrences where \'word1\' is followed by \'word2\'. In reality I want to find all the files wh

相关标签:
4条回答
  • 2020-12-14 17:19

    For you guys,

    if you want to search for multiple words (more than 2) at once in a single file and all the words must appear in the file at least once (logical AND), you can use the following regex which leverages lookahead assertions:

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

    A global search with this pattern will only return all the files that contain word1 AND word2 AND word3 AND word4 in any order (e.g. word4 may appear at the beginning and/or word2 may appear at the end of the file).

    I also wrote a little Python CLI helper which creates the regex automatically for you given the patterns you want to AND (though creating the regex by hand is pretty straightforward).

    Copy the following code, paste it in a new file and save it somewhere on your machine (I've called it regex_and_lookahead.py). Then make the file executable with chmod +x ./regex_and_lookahead.py (important, I used Python 3.6, the literal prefix f -> f'(?=[\s\S\\n]*({arg}))' won't work in previous versions):

    #!/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)
    

    Usage:

    ./regex_and_lookahead.py word1 word2 word3 word4
    

    Will generate the above regex. You can also use it to generate more complex regexes cause each parameter can have regex characters in it!

    As an example:

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

    Will generate the following regex:

    ^(?=[\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]*$
    

    Which will match a file if and only if all of the following conditions are true:

    • There's at least one occurrence of the string pattern with space;
    • There's at least one occurrence of either option1 or option2;
    • There's at least one occurrence of the word word3 delimited by word boundary assertions;
    • There is at least one occurrence of the string repeated pattern. repeated 6 times (i.e.: repeated pattern.repeated pattern.repeated pattern.repeated pattern.repeated pattern.repeated pattern.).

    As you can see, the sky is the only limit. Have fun!

    0 讨论(0)
  • 2020-12-14 17:20

    Use regex flag and search for (word1[\s\S\n]*word2)|(word2[\s\S\n]*word1)


    Made a small extension based on @tonix regex:

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

    0 讨论(0)
  • 2020-12-14 17:24

    VSCode has an open issue to support multiple searches. You may want to get on there and push them a little.

    0 讨论(0)
  • 2020-12-14 17:25

    Here is also a simple way for simple needs - use this as regex

    (word1)|(word2)|(word3)  
    

    It may not cover some cases, but has been working fine for me, and easy to remember to type it in.

    0 讨论(0)
提交回复
热议问题