Сведения о структуре запросов поиска кода
Синтаксис поиска в этой статье применяется только к поиску кода с помощью 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 сопоставление нового символа, поддерживаются в регулярных выражениях. См. статью"Использование регулярных выражений".
Использование логических операций
Поиск кода поддерживает логические выражения. Операторы можно использовать и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/"
Использование квалификаторов
Вы можете использовать специализированные ключевые слова для квалификации поиска.
- Квалификатор репозитория
- Квалификаторы организации и пользователей
- Корпоративный квалификатор
- Квалификатор языка
- Квалификатор пути
- Квалификатор символов
- Квалификатор содержимого
- Квалификатор Is
Квалификатор репозитория
Для поиска в репозитории используйте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
Полный список поддерживаемых имен языков см. в разделе 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} может использоваться для экранирования любого символа Юникода. Это означает, что вы можете использовать регулярные выражения для поиска точных строк, содержащих символы, которые нельзя вводить в строку поиска.
Наиболее распространенные функции регулярных выражений работают в поиске кода. Однако утверждения "осматривать вокруг" не поддерживаются.
Разделение терминов поиска
Все части поиска, такие как условия поиска, точные строки, регулярные выражения, квалификаторы, скобки и логические ключевые слова,ANDиORдолжны быть разделены друг от друга пробеламиNOT. Одним из исключений является то, что элементы внутри скобки,(``)не нужно отделять от круглых скобок.
Если поиск содержит несколько компонентов, которые не разделены пробелами или другим текстом, который не соответствует приведенным выше правилам, поиск кода попытается угадать, что вы означают. Он часто возвращается к обработке этого компонента запроса как точного текста для поиска. Например, следующий запрос:
printf("hello world\n");
Поиск кода будет отказаться от интерпретации скобки и кавычки в качестве специальных символов и вместо этого будет искать файлы, содержащие этот точный код.
Если поиск кода угадывает неправильно, вы всегда можете получить поиск, который вы хотите, используя кавычки и пробелы, чтобы сделать смысл понятным.
Учет регистра
По умолчанию поиск кода не учитывает регистр, и результаты будут включать как верхний регистр, так и строчные результаты. Вы можете выполнять поиск с учетом регистра с помощью регулярного выражения с отключенным регистром без учета регистра. Например, для поиска строки "True" используется:
/(?-i)True/