关于代码搜索查询结构
本文中的搜索语法仅适用于使用 GitHub 代码搜索来搜索代码。请注意,搜索非代码内容(例如 issue、用户和讨论)的语法和限定符与代码搜索的语法不同。有关非代码搜索的更多信息,请参阅 关于在 GitHub 上搜索 与 在 GitHub 上搜索。
搜索查询由搜索词(即您想要搜索的文本)和限定符(用于缩小搜索范围)组成。
未带限定符的裸词将匹配文件内容或文件路径。
例如,下面的查询
http-push
上述查询会匹配文件 docs/http-push.txt,即使该文件不包含词 http-push。如果文件 example.txt 包含词 http-push,它也会被匹配。
您可以用空格分隔输入多个词,以搜索同时满足这些词的文档。
例如,下面的查询
sparse index
搜索结果将包括所有同时包含词 sparse 与 index(顺序不必相同)的文档。例如,它会匹配包含 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 匹配换行符。请参见 使用正则表达式。
使用布尔运算
代码搜索支持布尔表达式。您可以使用 AND、OR 和 NOT 运算符来组合搜索词。
默认情况下,用空格分隔的相邻词等同于使用 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
注意
代码搜索目前不支持对组织或用户名使用正则表达式或部分匹配,因此您必须输入完整的组织或用户名才能使限定符生效。
企业限定符
要在企业范围内搜索文件,请使用 enterprise: 限定符。例如
enterprise:octocorp
此查询会搜索属于 octocorp 企业中组织的仓库。用户拥有的仓库不在搜索范围内。
语言限定符
要限定特定语言,请使用 language: 限定符。例如
language:ruby OR language:cpp OR language:csharp
完整的支持语言列表请参见 languages.yaml(位于 github-linguist/linguist)。如果您常用的语言未出现在列表中,可提交 PR 进行添加。
许可证限定符
要根据许可证或许可证族过滤仓库,请使用 license: 限定符并提供精确的许可证关键字,例如 Apache-2.0、CC、MIT。
license:MIT
有关许可证关键字列表,请参见 仓库许可。
路径限定符
要在文件路径中搜索,请使用 path: 限定符。它会匹配路径中任意位置出现搜索词的文件。例如,要查找路径中包含词 unit_tests 的文件,可使用
path:unit_tests
上述查询会匹配 src/unit_tests/my_test.py 和 src/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.aac 或 file.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
- Protocol Buffers
- Python
- R
- Ruby
- Rust
- Scala
- Starlark
- Swift
- Typescript
我们正努力为更多语言添加支持。如果您愿意贡献,可在开源的 Tree-sitter 解析器生态系统中为您的语言实现支持,符号搜索即基于该生态系统。
内容限定符
默认情况下,裸词会同时搜索路径和文件内容。若要仅在文件内容中搜索(不匹配路径),请使用 content: 限定符。例如
content:README.md
此查询只会匹配包含词 README.md 的文件,而不会匹配文件名为 README.md 的文件。
是否限定符
要根据仓库属性进行过滤,可使用 is: 限定符。is: 支持以下取值:
archived:仅搜索已归档的仓库。fork:仅搜索已 fork 的仓库。vendored:仅搜索检测为 vendored 的内容。generated:仅搜索检测为 generated 的内容。
例如
path:/^MIT.txt$/ is:archived
请注意,is: 限定符可以使用 NOT 运算符取反。例如,要搜索非归档仓库,可使用
log4j NOT is:archived
若要在结果中排除 fork,可使用
log4j NOT is:fork
使用正则表达式
代码搜索支持正则表达式,用于在代码中搜索模式。您可以在裸搜索词以及许多限定符中使用正则表达式,只需将正则表达式用斜杠括起来。
例如,要搜索正则表达式 sparse.*index,可使用
/sparse.*index/
请记得对正则表达式中的正斜杠进行转义。例如,要搜索 App/src 目录下的文件,可使用
/^App\/src\//
在正则表达式内部,\n 表示换行符,\t 表示制表符,\x{hhhh} 可用于转义任意 Unicode 字符。这意味着您可以使用正则表达式搜索包含无法直接在搜索框中键入的字符的精确字符串。
大多数常见的正则表达式特性在代码搜索中均可使用。但“不区间”断言(look‑around)不受支持。
分隔搜索词
搜索的所有组成部分——包括搜索词、精确字符串、正则表达式、限定符、圆括号以及布尔关键字 AND、OR、NOT——都必须用空格分隔。唯一的例外是圆括号 ( ) 内的内容不需要与括号本身留空格。
如果您的搜索包含未用空格分隔的多个组件,或包含其他不符合上述规则的文本,代码搜索会尝试猜测您的意图,通常会把该组件视为要精确搜索的文本。例如,下面的查询
printf("hello world\n");
代码搜索将放弃把圆括号和引号解释为特殊字符,而是直接搜索包含该代码的文件。
如果代码搜索的猜测不正确,您始终可以通过使用引号和空格来明确表达含义,从而获得想要的搜索结果。
大小写敏感性
默认情况下,代码搜索不区分大小写,结果会同时包含大小写形式。若要执行区分大小写的搜索,可使用关闭大小写不敏感的正则表达式。例如,要搜索字符串 "True",可使用
/(?-i)True/