跳至主要内容

了解 GitHub 代码搜索语法

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

关于代码搜索查询结构

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

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

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

例如,以下查询

http-push

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

您可以输入多个用空格分隔的词语来搜索满足所有词语的文档。

例如,以下查询

sparse index

搜索结果将包含所有包含词语“sparse”和“index”的文档,无论顺序如何。例如,它将匹配包含“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”匹配换行符。请参阅“使用正则表达式”。

使用布尔运算

代码搜索支持布尔表达式。您可以使用运算符“AND”、“OR”和“NOT”组合搜索词语。

默认情况下,用空格分隔的相邻词语等同于使用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

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

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

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

路径限定符

要在文件路径中搜索,请使用 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

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

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

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

  • Bash
  • C
  • C#
  • C++
  • CodeQL
  • Elixir
  • Go
  • JSX
  • Java
  • JavaScript
  • Lua
  • PHP
  • Protocol Buffers
  • Python
  • 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 字符。这意味着您可以使用正则表达式来搜索包含您无法在搜索栏中键入的字符的精确字符串。

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

分隔搜索词

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

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

printf("hello world\n");

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

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

区分大小写

代码搜索不区分大小写。搜索 True 将包括 大写 TRUE小写 true 的结果。您无法进行区分大小写的搜索。正则表达式搜索(例如 [t][H][i][S])也不区分大小写,因此除了 tHiS 的任何实例外,还会返回 ThisTHISthis