跳至主要内容

了解 GitHub 代码搜索语法

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

关于代码搜索查询结构

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

搜索查询由搜索词和限定符组成,搜索词是您要搜索的文本,限定符用于缩小搜索范围。

没有限定符的裸词将匹配文件的任何内容或文件的路径。

例如,以下查询

http-push

上述查询将匹配文件 docs/http-push.txt,即使它不包含 http-push 项。如果 example.txt 文件包含 http-push 项,它也将匹配该文件。

您可以输入用空格分隔的多个词语来搜索满足这两个词语的文件。

例如,以下查询

sparse index

搜索结果将包括所有包含 sparseindex 这两个词语(以任何顺序)的文件。例如,它将匹配包含 SparseIndexVector 的文件、包含短语 index for sparse trees 的文件,甚至包含 sparse 项的名为 index.txt 的文件。

用空格分隔的多个词语的搜索等效于搜索 hello AND world。还支持其他布尔运算,例如 hello OR world。有关布尔运算的更多信息,请参阅“使用布尔运算”。

代码搜索还支持搜索包含空格的精确字符串。有关更多信息,请参阅“查询完全匹配”。

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

您还可以通过将表达式括在斜杠中在搜索中使用正则表达式。有关使用正则表达式的更多信息,请参阅“使用正则表达式”。

查询完全匹配

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

"sparse index"

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

path:git language:"protocol buffers"

搜索引号和反斜杠

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

"name = \"tensorflow\""

要搜索包含反斜杠 \ 的代码,请使用双反斜杠 \\

转义序列 \\\" 也可以在引号之外使用。但是,不识别其他转义序列。不后跟 "\ 的反斜杠将包含在搜索中,并且保持不变。

正则表达式支持其他转义序列,例如 \n 以匹配换行符。请参阅“使用正则表达式”。

使用布尔运算

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

默认情况下,用空格分隔的相邻词语等效于使用 AND 运算符。例如,搜索查询 sparse indexsparse AND index 相同,这意味着搜索结果将包括所有包含 sparseindex 这两个词语(以任何顺序)的文件。

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

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: 限定符中使用一些有限的 glob 表达式。

例如,要搜索扩展名为 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?"

带引号的字符串禁用全局表达式,因此上述查询将仅匹配包含字面字符串 file? 的路径。

符号限定符

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

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

language:go symbol:WithContext

在某些语言中,您可以使用前缀搜索符号(例如,其类名的前缀)。例如,对于结构体 Maint 上的方法 deleteRows,如果使用 Go,则可以搜索 symbol:Maint.deleteRows,或者在 Rust 中搜索 symbol:Maint::deleteRows

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

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

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

  • Bash
  • C
  • C#
  • C++
  • CodeQL
  • Elixir
  • Go
  • JSX
  • Java
  • JavaScript
  • Lua
  • PHP
  • Protocol Buffers
  • Python
  • R
  • Ruby
  • Rust
  • Scala
  • Starlark
  • Swift
  • Typescript

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

内容限定符

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

content:README.md

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

Is 限定符

要根据存储库属性进行筛选,可以使用 is: 限定符。is: 支持以下值

  • archived:将搜索限制为归档的存储库。
  • fork:将搜索限制为派生的存储库。
  • vendored:将搜索限制为检测为已引入的內容。
  • generated:将搜索限制为检测为已生成的內容。

例如

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

请注意,可以使用 NOT 运算符反转 is: 限定符。要搜索未归档的存储库,您可以搜索

log4j NOT is:archived

要从结果中排除派生存储库,您可以搜索

log4j NOT is:fork

使用正则表达式

代码搜索支持正则表达式来搜索代码中的模式。您可以在裸词搜索术语以及许多限定符中使用正则表达式,方法是在正则表达式周围加上斜杠。

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

/sparse.*index/

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

/^App\/src\//

在正则表达式内部,\n 代表换行符,\t 代表制表符,\x{hhhh} 可用于转义任何 Unicode 字符。这意味着您可以使用正则表达式搜索包含无法在搜索栏中键入的字符的确切字符串。

大多数常见的正则表达式功能在代码搜索中都有效。但是,不支持“环视”断言。

分隔搜索词

搜索的所有部分,例如搜索词、精确字符串、正则表达式、限定符、括号以及布尔关键字 ANDORNOT,必须用空格彼此分隔。唯一的例外是括号 ( ) 内部的项目不需要与括号分隔。

如果您的搜索包含多个未用空格分隔的组件,或不遵循上述规则的其他文本,代码搜索将尝试猜测您的意思。它通常会退回到将查询的该组件视为要搜索的确切文本。例如,以下查询

printf("hello world\n");

代码搜索将放弃将括号和引号解释为特殊字符,而是搜索包含该确切代码的文件。

如果代码搜索猜测错误,您可以始终通过使用引号和空格使含义清晰来获得所需的搜索结果。

区分大小写

默认情况下,代码搜索不区分大小写,结果将包括大写和小写结果。您可以通过使用关闭大小写不敏感的正则表达式进行区分大小写的搜索。例如,要搜索字符串“True”,您将使用

/(?-i)True/