了解 github 代码搜索语法

Posted by BY Blog on September 1, 2023

了解 GitHub 代码搜索语法

在本文中

  • 关于代码搜索查询结构
  • 查询精确匹配
  • 使用布尔运算
  • 使用限定符
  • 使用正则表达式

您可以使用专门的代码限定符、正则表达式和布尔运算来构建所需结果的搜索查询。

关于代码搜索查询结构

本文中的搜索语法仅适用于使用 GitHub 代码搜索来搜索代码。请注意,搜索非代码内容(例如问题、用户和讨论)的语法和限定符与代码搜索的语法不同。有关非代码搜索的更多信息,请参阅“关于在 GitHub 上搜索”和“在 GitHub 上搜索”。

搜索查询由搜索词和限定符组成,搜索词包含要搜索的文本,限定符可缩小搜索范围。

没有限定符的裸术语将匹配文件的内容或文件的路径。

例如,以下查询:

http-push

上面的查询将匹配该文件docs/http-push.txt,即使它不包含该术语http-pushexample.txt如果包含术语 ,它还将匹配名为 的文件http-push

您可以输入多个以空格分隔的术语来搜索同时满足这两个术语的文档。

例如,以下查询:

sparse index

搜索结果将包括以任意顺序包含术语sparse和 的所有文档。index例如,它会匹配包含 的文件SparseIndexVector、包含短语 的文件,甚至包含术语 的index for sparse trees文件。 index.txtsparse

搜索由空格分隔的多个术语相当于搜索hello AND worldhello OR world还支持其他布尔运算,例如。有关布尔运算的详细信息,请参阅“使用布尔运算”。

代码搜索还支持搜索精确的字符串,包括空格。详细信息请参见“精确匹配查询”。

您可以使用专门的限定符(例如repo:language:和 )来缩小代码搜索范围path:。有关可在代码搜索中使用的限定符的更多信息,请参阅“使用限定符”。

您还可以在搜索中使用正则表达式,方法是将表达式括在斜杠中。有关使用正则表达式的详细信息,请参阅“使用正则表达式”。

查询精确匹配

要搜索精确的字符串(包括空格),您可以将该字符串括在引号中。例如:

"sparse index"

要搜索包含引号的短语,可以使用反斜杠转义引号。例如,要查找确切的字符串name = "tensorflow",您可以搜索:

"name = \"tensorflow\""

您还可以在限定符中使用带引号的字符串,例如:

path:git language:"protocol buffers"

使用布尔运算

代码搜索支持布尔表达式。您可以使用运算符ANDORNOT来组合搜索词。

默认情况下,由空格分隔的相邻术语相当于使用AND运算符。例如,搜索查询sparse index与 相同sparse AND index,这意味着搜索结果将包括以任意顺序包含术语sparse和 的所有文档。index

要搜索包含一个术语或另一个术语的文档,您可以使用OR运算符。例如,以下查询将匹配包含 或 的sparse文档index

sparse OR index

要从搜索结果中排除文件,您可以使用NOT运算符。例如,要排除__testing__目录中的文件,您可以搜索:

"fatal error" NOT path:__testing__

您可以使用括号来表达更复杂的布尔表达式。例如:

(language:ruby OR language:python) AND NOT path:"/tests/"

使用限定符

您可以使用专门的关键字来限定您的搜索。

存储库限定符

要在存储库中搜索,请使用repo:限定符。您必须提供完整的存储库名称,包括所有者。例如:

repo:github-linguist/linguist

要在一组存储库中搜索,您可以repo:使用布尔运算符组合多个限定符OR。例如:

repo:github-linguist/linguist OR repo:tree-sitter/tree-sitter

注意:代码搜索当前不支持正则表达式或存储库名称的部分匹配,因此您必须输入整个存储库名称(包括用户前缀)才能使限定符发挥作用repo:

组织和用户资格

要搜索组织内的文件,请使用org:限定符。例如:

org:github

要搜索个人帐户中的文件,请使用user:限定符。例如:

user:octocat

注意:代码搜索当前不支持正则表达式或组织或用户名的部分匹配,因此您必须键入整个组织或用户名才能使限定符发挥作用。

语言限定词

要缩小范围到特定语言,请使用language:限定符。例如:

language:ruby OR language:cpp OR language:csharp

有关支持的语言名称的完整列表,请参阅github-linguist/linguist中的languages.yaml。如果您的首选语言不在列表中,您可以打开拉取请求来添加它。

路径限定符

要在文件路径中搜索,请使用path:限定符。这将匹配文件路径中任何位置包含该术语的文件。例如,要查找unit_tests路径中包含该术语的文件,请使用:

path:unit_tests

上面的查询将匹配两者src/unit_tests/my_test.pysrc/docs/unit_tests.md因为它们都包含unit_test在其路径中的某个位置。

要仅匹配特定文件名(而不是路径的一部分),您可以使用正则表达式:

path:/(^|\/)README\.md$/

请注意,.文件名中的 被转义,因为.对于正则表达式具有特殊含义。有关使用正则表达式的详细信息,请参阅“使用正则表达式”。

您还可以在限定符中使用一些有限的全局表达式path:

例如,要搜索扩展名为 的文件txt,您可以使用:

path:*.txt

要在 src 目录中搜索 JavaScript 文件,您可以使用:

path:src/*.js
  • 默认情况下,glob 表达式不会锚定到路径的开头,因此上面的表达式仍会匹配类似app/src/main.js. 但如果您为表达式添加前缀/,它将锚定到开头。例如:

    path:/src/*.js
    
  • 请注意,与字符*不匹配/,因此对于上面的示例,所有结果都将是该src目录的直接后代。要在子目录内匹配,以便结果包含深度嵌套的文件,例如/src/app/testing/utils/example.js,您可以使用**. 例如:

    path:/src/**/*.js
    

您还可以使用?全局字符。例如,要匹配路径file.aacfile.abc,您可以使用:

path:*.a?c

要搜索包含“*”或“?”等特殊字符的文件名,只需使用带引号的字符串:

path:"file?"

Glob 表达式对于带引号的字符串是禁用的,因此上面的查询将仅匹配包含文字 string 的路径file?

符号限定符

您可以使用限定符在代码中搜索符号定义,例如函数或类定义symbol:。符号搜索基于使用开源Tree-sitter解析器生态系统解析代码,因此不需要额外的设置或构建工具集成。

例如,要搜索名为 的符号WithContext

language:go symbol:WithContext

在某些语言中,您可以使用前缀(例如类名的前缀)来搜索符号。deleteRows例如,对于struct 上的方法Maint,您可以symbol:Maint.deleteRows在使用 Go 还是symbol:Maint::deleteRowsRust 中进行搜索。

您还可以将正则表达式与符号限定符一起使用。例如,以下查询将查找人们在 Rust 中为该String类型实现的转换:

language:rust symbol:/^String::to_.*/

请注意,此限定符仅搜索定义而不搜索引用,并且尚未完全支持所有符号类型或语言。以下语言支持符号提取。

  • C#
  • Python
  • Go
  • Java
  • JavaScript
  • TypeScript
  • PHP
  • Protocol Buffers
  • Ruby
  • Rust

我们正在努力增加对更多语言的支持。如果您想为这项工作做出贡献,您可以在开源Tree-sitter解析器生态系统中添加对您的语言的支持,符号搜索就是基于该生态系统的。

内容限定符

默认情况下,裸词搜索路径和文件内容。要将搜索限制为严格匹配文件内容而不是文件路径,请使用限定符content:。例如:

content:README.md

此查询将仅匹配包含该术语的文件README.md,而不匹配名为 的文件README.md

是预选赛

要根据存储库属性进行过滤,您可以使用限定符is:。目前,is:支持两个值:archived,将搜索限制为存档存储库;以及fork,将搜索限制为分叉存储库。例如:

path:/^MIT.txt$/ is:archived

请注意,is:限定符可以与运算符反转NOT。要搜索非存档存储库,您可以搜索:

log4j NOT is:archived

要从结果中排除分叉,您可以搜索:

log4j NOT is:fork

使用正则表达式

代码搜索支持正则表达式来搜索代码中的模式。您可以在纯搜索词以及许多限定符中使用正则表达式,只需将正则表达式括在斜杠中即可。

例如,要搜索正则表达式sparse.*index,您可以使用:

/sparse.*index/

请注意,您必须转义正则表达式中的任何正斜杠。例如,要搜索App/src目录中的文件,您可以使用:

/^App\/src\//