Сведения о структуре запросов поиска кода
Синтаксис поиска в этой статье применяется только к поиску кода с помощью GitHub поиска кода. Обратите внимание, что синтаксис и квалификаторы для поиска содержимого, отличного от кода, таких как проблемы, пользователи и обсуждения, не совпадают с синтаксисом для поиска кода. Дополнительные сведения о поиске, отличном от кода, см. в разделе "[AUTOTITLE" и "Сведения о поиске в GitHub](/search-github/searching-on-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\""
Для поиска кода, содержащего обратную косую черту, \
используйте двойную обратную косую черту. \\
Две escape-последовательности и \"
могут использоваться вне кавычки\\
. Однако другие escape-последовательности не распознаются. Обратная косая черта, за которой не следует "
или \
включена в поиск, без изменений.
Дополнительные escape-последовательности, такие как \n
сопоставление нового символа, поддерживаются в регулярных выражениях. См. раздел "Использование регулярных выражений".
Использование логических операций
Поиск кода поддерживает логические выражения. Операторы можно использовать и NOT
объединить термины AND``OR
поиска.
По умолчанию смежные термины, разделенные пробелами, эквивалентны использованию 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/"
Использование квалификаторов
Вы можете использовать специализированные ключевые слова для квалификации поиска.
- Квалификатор репозитория
- Квалификаторы организации и пользователей
- Квалификатор языка
- Квалификатор пути
- Квалификатор символов
- Квалификатор содержимого
- Квалификатор Is
Квалификатор репозитория
Для поиска в репозитории используйте repo:
квалификатор. Необходимо указать полное имя репозитория, включая владельца. Например:
repo:github-linguist/linguist
Для поиска в наборе репозиториев можно объединить несколько repo:
квалификаторов с логическим оператором OR
. Например:
repo:github-linguist/linguist OR repo:tree-sitter/tree-sitter
Note
Поиск кода в настоящее время не поддерживает регулярные выражения или частичное сопоставление имен репозитория, поэтому вам придется ввести все имя репозитория (включая префикс пользователя), чтобы repo:
квалификатор работал.
Квалификаторы организации и пользователей
Для поиска файлов в организации используйте org:
квалификатор. Например:
org:github
Чтобы найти файлы в личная учетная запись, используйте user:
квалификатор. Например:
user:octocat
Note
Поиск кода в настоящее время не поддерживает регулярные выражения или частичное сопоставление для имен организаций или пользователей, поэтому вам придется ввести имя всей организации или пользователя для работы квалификатора.
Квалификатор языка
Чтобы сузить до определенных языков, используйте language:
квалификатор. Например:
language:ruby OR language:cpp OR language:csharp
Полный список поддерживаемых имен языков см . в разделе language.yaml в github-linguist/linguist/linguist. Если предпочитаемый язык отсутствует в списке, можно открыть запрос на вытягивание, чтобы добавить его.
Квалификатор пути
Для поиска в пути к файлам используйте path:
квалификатор. Это будет соответствовать файлам, содержащим термин в любом месте пути к файлу. Например, чтобы найти файлы, содержащие термин unit_tests
в пути, используйте следующую команду:
path:unit_tests
Приведенный выше запрос будет соответствовать обоим src/unit_tests/my_test.py
и src/docs/unit_tests.md
так как они оба содержат unit_test
где-то в пути.
Чтобы сопоставить только определенное имя файла (и не часть пути), можно использовать регулярное выражение:
path:/(^|\/)README\.md$/
Обратите внимание, что .
в имени файла экранируется, так как .
имеет особое значение для регулярных выражений. Дополнительные сведения об использовании регулярных выражений см. в разделе "Использование регулярных выражений".
Можно также использовать некоторые ограниченные выражения глобов в квалификаторе path:
.
Например, для поиска файлов с расширением txt
можно использовать следующее:
path:*.txt
Чтобы найти файлы JavaScript в каталоге, можно использовать следующее `src` :
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:
квалификатор. Поиск символов основан на анализе кода с помощью экосистемы синтаксического анализа дерева открытый код, поэтому дополнительная настройка или интеграция средств сборки не требуется.
Например, для поиска символа с именем WithContext
:
language:go symbol:WithContext
На некоторых языках можно искать символы с помощью префикса (например, префикса имени класса). Например, для метода deleteRows
структуры Maint
можно выполнить поиск symbol:Maint.deleteRows
, если вы используете Go или symbol:Maint::deleteRows
в Rust.
Вы также можете использовать регулярные выражения с квалификатором символов. Например, следующий запрос будет находить преобразования, реализованные в 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
Мы работаем над добавлением поддержки для дополнительных языков. Если вы хотите помочь в этой работе, вы можете добавить поддержку языка в экосистеме синтаксического анализа дерева открытый код дерева, на основе которого основан поиск символов.
Квалификатор содержимого
По умолчанию обнаженные термины выполняют поиск как пути, так и содержимое файла. Чтобы ограничить поиск строго соответствующим содержимому файла, а не пути к файлам, используйте 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}
может использоваться для экранирования любого символа Юникода. Это означает, что вы можете использовать регулярные выражения для поиска точных строк, содержащих символы, которые нельзя вводить в строку поиска.
Наиболее распространенные функции регулярных выражений работают в поиске кода. Однако утверждения "осматривать вокруг" не поддерживаются.
Разделение терминов поиска
Все части поиска, такие как условия поиска, точные строки, регулярные выражения, квалификаторы, скобки и логические ключевые слова, OR
и NOT
должны быть разделены друг от друга пробеламиAND
. Одним из исключений является то, что элементы внутри скобки, (
)
не нужно отделять от круглых скобок.
Если поиск содержит несколько компонентов, которые не разделены пробелами или другим текстом, который не соответствует приведенным выше правилам, поиск кода попытается угадать, что вы означают. Он часто возвращается к обработке этого компонента запроса как точного текста для поиска. Например, следующий запрос:
printf("hello world\n");
Поиск кода будет отказаться от интерпретации скобки и кавычки в качестве специальных символов и вместо этого будет искать файлы, содержащие этот точный код.
Если поиск кода угадывает неправильно, вы всегда можете получить поиск, который вы хотите, используя кавычки и пробелы, чтобы сделать смысл понятным.
Учет регистра
По умолчанию поиск кода не учитывает регистр, и результаты будут включать как верхний регистр, так и строчные результаты. Вы можете выполнять поиск с учетом регистра с помощью регулярного выражения с отключенным регистром без учета регистра. Например, для поиска строки "True" используется:
/(?-i)True/