# Понимание синтаксиса поиска кода в GitHub

Вы можете создавать поисковые запросы для результатов с помощью специализированных квалификаторов кода, регулярных выражений и логических операций.

## Сведения о структуре запросов поиска кода

Синтаксис поиска в этой статье применяется только к поиску кода с помощью GitHub поиска кода. Обратите внимание, что синтаксис и квалификаторы для поиска содержимого, отличного от кода, таких как проблемы, пользователи и обсуждения, не совпадают с синтаксисом для поиска кода. Дополнительные сведения о поиске, отличном от кода, см. в разделе \[AUTOTITLE и [О поиске на GitHub](/ru/search-github/getting-started-with-searching-on-github/about-searching-on-github)]\(/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\""
```

Для поиска кода, содержащего обратную косую черту, `\`используйте двойную обратную косую черту. `\\`

Две escape-последовательности и `\\` могут использоваться вне кавычки`\"`. Однако другие escape-последовательности не распознаются. Обратная косая черта, за которой не следует `"` или `\` включена в поиск, без изменений.

Дополнительные escape-последовательности, такие как `\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
```

Полный список поддерживаемых имен языков см [. в разделе language.yaml](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml) в [github-linguist/linguist/linguist](https://github.com/github-linguist/linguist). Если предпочитаемый язык отсутствует в списке, можно открыть запрос на вытягивание, чтобы добавить его.

### Квалификация на лицензию

Для фильтрации репозиториев по их лицензии или семейству лицензий используйте `license:` квалификатор и точное ключевое слово лицензии, например `Apache-2.0`, `CC`, `MIT`.

```text
license:MIT
```

См. [Лицензирование репозитория](/ru/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:` .

Например, для поиска файлов с расширением `txt`можно использовать следующее:

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

<br>
Чтобы найти файлы JavaScript в каталоге, можно использовать следующее `src` :

```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:` квалификатор. Поиск символов основан на парсере вашего кода с помощью экосистемы парсера open source [Tree-sitter](https://github.com/tree-sitter), поэтому не требуется дополнительная настройка или интеграция инструментов сборки.

Например, для поиска символа с именем `WithContext`:

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

На некоторых языках можно искать символы с помощью префикса (например, префикса имени класса). Например, для метода `deleteRows` структуры `Maint`можно выполнить поиск `symbol:Maint.deleteRows` , если вы используете Go или `symbol:Maint::deleteRows` в Rust.

Вы также можете использовать регулярные выражения с квалификатором символов. Например, следующий запрос будет находить преобразования, реализованные в Rust для `String` типа:

```text
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

Мы работаем над добавлением поддержки для дополнительных языков. Если вы хотите внести вклад в эту работу, вы можете добавить поддержку вашего языка в экосистему парсера open source [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}` может использоваться для экранирования любого символа Юникода. Это означает, что вы можете использовать регулярные выражения для поиска точных строк, содержащих символы, которые нельзя вводить в строку поиска.

Наиболее распространенные функции регулярных выражений работают в поиске кода. Однако утверждения "осматривать вокруг" не поддерживаются.

## Разделение терминов поиска

Все части поиска, такие как условия поиска, точные строки, регулярные выражения, квалификаторы, скобки и логические ключевые слова, `AND`и `OR`должны быть разделены друг от друга пробелами`NOT`. Одним из исключений является то, что элементы внутри скобки, `(``)`не нужно отделять от круглых скобок.

Если поиск содержит несколько компонентов, которые не разделены пробелами или другим текстом, который не соответствует приведенным выше правилам, поиск кода попытается угадать, что вы означают. Он часто возвращается к обработке этого компонента запроса как точного текста для поиска. Например, следующий запрос:

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

Поиск кода будет отказаться от интерпретации скобки и кавычки в качестве специальных символов и вместо этого будет искать файлы, содержащие этот точный код.

Если поиск кода угадывает неправильно, вы всегда можете получить поиск, который вы хотите, используя кавычки и пробелы, чтобы сделать смысл понятным.

## Учет регистра

По умолчанию поиск кода не учитывает регистр, и результаты будут включать как верхний регистр, так и строчные результаты. Вы можете выполнять поиск с учетом регистра с помощью регулярного выражения с отключенным регистром без учета регистра. Например, для поиска строки "True" используется:

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