Skip to main content

了解 GitHub 代码搜索语法

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

关于代码搜索查询结构

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

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

一个没有限定符的裸词将与文件的内容或文件的路径匹配。

例如,以下查询:

http-push

上述查询与文件 docs/http-push.txt 匹配,即使该文件不包含术语 http-push。 该查询还与名为 example.txt 的文件匹配(如果文件包含术语 http-push)。

可以输入多个用空格分隔的术语,以搜索满足这两个字词的文档。

例如,以下查询:

sparse index

搜索结果将包括包含术语 sparseindex 的所有文档,并按任意顺序排列。 例如,它将匹配包含 SparseIndexVector 的文件、带有短语 index for sparse trees 的文件,甚至匹配名为 index.txt 且包含术语 sparse 的文件。

搜索多个用空格分隔的术语等效于搜索 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?"

由于对带引号的字符串禁用 glob 表达式,因此上述查询将仅匹配包含文本字符串 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
  • 协议缓冲区
  • 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

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

log4j NOT is:archived

若要从结果中排除分支,可以搜索:

log4j NOT is:fork

使用正则表达式

代码搜索支持正则表达式来搜索代码中的模式。 通过用斜杠将正则表达式括起来,可以在裸搜索词以及许多限定符中使用正则表达式。

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

/sparse.*index/

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

/^App\/src\//

在正则表达式中,\n 表示换行符,\t 表示制表符,\x{hhhh} 可用于转义任何 Unicode 字符。 这意味着,你可以使用正则表达式来搜索包含无法键入搜索栏的字符的完全匹配字符串。

最常见的正则表达式功能可在代码搜索中使用。 但是,不支持“look-around”断言。

分隔搜索词

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

如果搜索包含多个未用空格分隔的组成部分,或者不符合以上所列规则的其他文本,则代码搜索将尝试猜测你的意图。 它通常会将查询的这个组成部分视为要搜索的完全匹配文本。 例如,以下查询:

printf("hello world\n");

代码搜索不会将括号和引号解释为特殊字符,而是会搜索包含完全匹配代码的文件。

如果代码搜索猜测出错,你始终可以使用引号和空格来获取所需的搜索,明确它们的含义。

事例敏感性

默认情况下,代码搜索不区分大小写。 搜索 True 将包括_大写结果_ TRUE 和_小写结果_ true。 可以在关闭不区分大小写功能的情况下使用正则表达式(如 (?-i)True)来进行区分大小写的搜索。