# 了解GitHub代码搜索语法

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

## 关于代码搜索查询结构

本文中的搜索语法仅适用于使用 GitHub 代码搜索进行的代码搜索。 请注意，用于搜索非代码内容（如问题、用户和讨论）的语法和限定符与代码搜索的语法不同。 有关非代码搜索的详细信息，请参阅 [关于在GitHub上的搜索](/zh/search-github/getting-started-with-searching-on-github/about-searching-on-github) 和 [在 GitHub 上搜索](/zh/search-github/searching-on-github)。

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

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

例如，以下查询：

```text
http-push
```

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

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

例如，以下查询：

```text
sparse index
```

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

搜索多个用空格分隔的术语等效于搜索 `hello AND world`。 还支持其他布尔运算，例如 `hello OR world`。 有关布尔运算的详细信息，请参阅[使用布尔运算](#using-boolean-operations)。

代码搜索还支持搜索确切的字符串，包括空格。 有关详细信息，请参阅[查询完全匹配项](#query-for-an-exact-match)。

可以使用专用限定符（如 `repo:`、`language:` 和 `path:`）缩小代码搜索范围。 有关可在代码搜索中使用的限定符的详细信息，请参阅[使用限定符](#using-qualifiers)。

还可以通过用斜杠将表达式括起来，在搜索中使用正则表达式。 有关使用正则表达式的详细信息，请参阅[使用正则表达式](#using-regular-expressions)。

## 查询完全匹配项

要搜索确切的字符串（包括空格），可以用引号将字符串括起来。 举例来说：

```text
"sparse index"
```

还可以在限定符中使用带引号的字符串，例如：

```text
path:git language:"protocol buffers"
```

## 搜索引号和反斜杠

要搜索包含引号的代码，可以使用反斜杠对引号进行转义。 例如，若要查找确切的字符串 `name = "tensorflow"`，可以搜索：

```text
"name = \"tensorflow\""
```

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

两个转义序列 `\\` 和 `\"` 也可以在引号之外使用。 但无法识别其他转义序列。 后面没有跟 `"` 或 `\` 的反斜杠包括在搜索中，保持不变。

正则表达式支持其他转义序列，例如 `\n`，以匹配换行符。 请参阅[使用正则表达式](#using-regular-expressions)。

## 使用布尔运算

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

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

若要搜索包含某个或其他术语的文档，可以使用 `OR` 运算符。 例如，以下查询将匹配包含 `sparse` 或 `index` 的文档：

```text
sparse OR index
```

若要从搜索结果中排除文件，可以使用 `NOT` 运算符。 例如，要排除 `__testing__` 目录中的文件，可以搜索：

```text
"fatal error" NOT path:__testing__
```

可以使用括号来表示更复杂的布尔表达式。 举例来说：

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

## 使用限定符

可以使用专用关键字来限定搜索。
\*
[存储库限定符](#repository-qualifier)
\*
[组织和用户限定符](#organization-and-user-qualifiers)
\*
[企业限定符](#enterprise-qualifier)
\*
[语言限定符](#language-qualifier)
\*
[许可证限定符](#license-qualifier)
\*
[路径限定符](#path-qualifier)
\*
[符号限定符](#symbol-qualifier)
\*
[内容限定符](#content-qualifier)
\*
[Is 限定符](#is-qualifier)

### 存储库限定符

若要在存储库中搜索，请使用 `repo:` 限定符。 必须提供完整的存储库名称，包括所有者。 举例来说：

```text
repo:github-linguist/linguist
```

若要在一组存储库中搜索，可以将多个 `repo:` 限定符与布尔运算符 `OR` 组合在一起。 举例来说：

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

> \[!NOTE]
> 代码搜索目前不支持正则表达式或存储库名称的部分匹配，因此必须键入整个存储库名称（包括用户前缀）才能使用 `repo:` 限定符。

### 组织和用户限定符

若要搜索组织内的文件，请使用 `org:` 限定符。 举例来说：

```text
org:github
```

若要搜索个人帐户内的文件，请使用 `user:` 限定符。 举例来说：

```text
user:octocat
```

> \[!NOTE]
> 代码搜索当前不支持组织或用户名的正则表达式或部分匹配，因此必须键入整个组织或用户名才能使用限定符。

### 企业限定符

若要搜索企业中的文件，请使用 `enterprise:` 限定符。 举例来说：

```text
enterprise:octocorp
```

这会搜索企业中组织拥有的 `octocorp` 存储库。 不包括用户拥有的存储库。

### 语言限定符

若要缩小到特定语言的范围，请使用 `language:` 限定符。 举例来说：

```text
language:ruby OR language:cpp OR language:csharp
```

有关支持的语言名称的完整列表，请参阅 [github-linguist/linguist](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml) 中的 [languages.yaml](https://github.com/github-linguist/linguist)。 如果你的首选语言不在列表中，则可以打开拉取请求来添加它。

### 许可证限定符

若要根据其许可证或许可证系列筛选存储库，请使用`license:`限定符和确切的许可证关键字，例如`Apache-2.0``CC`。 `MIT`

```text
license:MIT
```

有关许可证关键字列表，请参阅 [为仓库颁发许可证](/zh/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository#searching-github-by-license-type) 。

### 路径限定符

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

```text
path:unit_tests
```

上面的查询将匹配 `src/unit_tests/my_test.py` 和 `src/docs/unit_tests.md`，因为它们都包含路径中某处的 `unit_test`。

若要仅匹配特定文件名（而不是路径的一部分），可以使用正则表达式：

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

请注意，文件名中的 `.` 是转义的，因为 `.` 对正则表达式具有特殊含义。 有关使用正则表达式的详细信息，请参阅[使用正则表达式](#using-regular-expressions)。

<br>

还可以在 `path:` 限定符中使用一些有限的 glob 表达式。

例如，若要搜索扩展名为 `txt` 的文件，可以使用：

```text
path:*.txt
```

<br>
若要在 `src` 目录中搜索 JavaScript 文件，可以使用：

```text
path:src/*.js
```

* 默认情况下，glob 表达式不会定位到路径的开头，因此上述表达式仍将与类似 `app/src/main.js` 的路径匹配。 但是，如果在表达式前面加上 `/`，它将定位到开头。 举例来说：

  ```text
  path:/src/*.js
  ```

* 请注意，`*` 与 `/` 字符不匹配，因此对于上面的示例，所有结果都将是 `src` 目录的直接后代。 若要在子目录中匹配，以便结果包含深层嵌套文件（如 `/src/app/testing/utils/example.js`），可以使用 `**`。 举例来说：

  ```text
  path:/src/**/*.js
  ```

<br>

可以使用 `?` 全局字符。 例如，若要匹配路径 `file.aac` 或 `file.abc`，可以使用：

```text
path:*.a?c
```

<br>
若要搜索包含特殊字符（如 `*` 或 `?`）的文件名，只需使用带引号的字符串：

```text
path:"file?"
```

由于对带引号的字符串禁用 glob 表达式，因此上述查询将仅匹配包含文本字符串 `file?` 的路径。

### 符号限定符

可以使用 `symbol:` 限定符在代码中搜索符号定义（例如函数或类定义）。 符号搜索基于使用开源[Tree-sitter](https://github.com/tree-sitter)解析器生态系统来解析代码，因此无需额外的设置或构建工具集成。

例如，若要搜索名为 `WithContext` 的符号：

```text
language:go symbol:WithContext
```

在某些语言中，可以使用前缀（例如类名的前缀）搜索符号。 例如，对于结构 `deleteRows` 上的方法 `Maint`，可以在使用 Go 时搜索 `symbol:Maint.deleteRows`，或在 Rust 中搜索 `symbol:Maint::deleteRows`。

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

```text
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](https://github.com/tree-sitter)解析器生态系统中添加对您语言的支持，符号搜索就是基于这个生态系统开发的。

### 内容限定符

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

```text
content:README.md
```

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

### Is 限定符

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

* ```
          `archived`：将搜索范围限制为存档存储库。
  ```
* ```
          `fork`：将搜索范围限制为分支存储库。
  ```
* ```
          `vendored`：将搜索范围限制为检测为供应的内容。
  ```
* ```
          `generated`：将搜索范围限制为检测为生成的内容。
  ```

举例来说：

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

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

```text
log4j NOT is:archived
```

若要从结果中排除分支，可以搜索：

```text
log4j NOT is:fork
```

## 使用正则表达式

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

例如，若要搜索正则表达式 `sparse.*index`，可以使用：

```text
/sparse.*index/
```

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

```text
/^App\/src\//
```

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

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

## 分隔搜索词

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

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

```text
printf("hello world\n");
```

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

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

## 事例敏感性

默认情况下，代码搜索不区分大小写，且结果同时包含大写和小写结果。 您可以通过使用关闭大小写忽略的正则表达式来进行区分大小写的搜索。 例如，若要搜索“True”字符串，可以使用：

```text
/(?-i)True/
```