{"meta":{"title":"Понимание синтаксиса поиска кода в GitHub","intro":"Вы можете создавать поисковые запросы для результатов с помощью специализированных квалификаторов кода, регулярных выражений и логических операций.","product":"Поиск на GitHub","breadcrumbs":[{"href":"/ru/search-github","title":"Поиск на GitHub"},{"href":"/ru/search-github/github-code-search","title":"Поиск кода на GitHub"},{"href":"/ru/search-github/github-code-search/understanding-github-code-search-syntax","title":"Синтаксис поиска кода"}],"documentType":"article"},"body":"# Понимание синтаксиса поиска кода в GitHub\n\nВы можете создавать поисковые запросы для результатов с помощью специализированных квалификаторов кода, регулярных выражений и логических операций.\n\n## Сведения о структуре запросов поиска кода\n\nСинтаксис поиска в этой статье применяется только к поиску кода с помощью GitHub поиска кода. Обратите внимание, что синтаксис и квалификаторы для поиска содержимого, отличного от кода, таких как проблемы, пользователи и обсуждения, не совпадают с синтаксисом для поиска кода. Дополнительные сведения о поиске, отличном от кода, см. в разделе \\[AUTOTITLE и [О поиске на GitHub](/ru/search-github/getting-started-with-searching-on-github/about-searching-on-github)]\\(/search-github/searching-on-github).\n\nПоисковые запросы состоят из терминов поиска, содержащих текст, который требуется искать, и квалификаторы, которые сужают поиск.\n\nГолый термин без квалификаторов будет соответствовать содержимому файла или пути файла.\n\nНапример, следующий запрос:\n\n```text\nhttp-push\n```\n\nПриведенный выше запрос будет соответствовать файлу `docs/http-push.txt`, даже если он не содержит термин `http-push`. Он также будет соответствовать файлу, который `example.txt` вызывается, если он содержит термин `http-push`.\n\nМожно ввести несколько терминов, разделенных пробелами, чтобы найти документы, удовлетворяющие обоим условиям.\n\nНапример, следующий запрос:\n\n```text\nsparse index\n```\n\nРезультаты поиска будут содержать все документы, содержащие как термины `sparse` , так и `index`в любом порядке. В качестве примеров он будет соответствовать файлу, содержаму `SparseIndexVector`, файлу с фразой `index for sparse trees`и даже файлу с именем `index.txt` , который содержит термин `sparse`.\n\nПоиск нескольких терминов, разделенных пробелами, эквивалентен поиску `hello AND world`. Также поддерживаются другие логические операции, например `hello OR world`. Дополнительные сведения о логических операциях см. в разделе [\"Использование логических операций](#using-boolean-operations)\".\n\nПоиск кода также поддерживает поиск точной строки, включая пробелы. Дополнительные сведения см. в разделе [\"Запрос точного соответствия](#query-for-an-exact-match)\".\n\nВы можете сузить поиск кода с помощью специализированных квалификаторов, таких как `repo:`, `language:` и `path:`. Дополнительные сведения о квалификаторов, которые можно использовать в поиске кода, см. в разделе [\"Использование квалификаторов](#using-qualifiers)\".\n\nВы также можете использовать регулярные выражения в поисках, окружив выражение косой чертой. Дополнительные сведения об использовании регулярных выражений см. в разделе [\"Использование регулярных выражений](#using-regular-expressions)\".\n\n## Запрос точного совпадения\n\nДля поиска точной строки, включая пробелы, можно окружить строку в кавычках. Например:\n\n```text\n\"sparse index\"\n```\n\nМожно также использовать кавычки в квалификаторов, например:\n\n```text\npath:git language:\"protocol buffers\"\n```\n\n## Поиск кавычки и обратных косых кавычек\n\nДля поиска кода, содержащего кавычки, можно экранировать кавычки с помощью обратной косой черты. Например, чтобы найти точную строку `name = \"tensorflow\"`, можно выполнить поиск:\n\n```text\n\"name = \\\"tensorflow\\\"\"\n```\n\nДля поиска кода, содержащего обратную косую черту, `\\`используйте двойную обратную косую черту. `\\\\`\n\nДве escape-последовательности и `\\\\` могут использоваться вне кавычки`\\\"`. Однако другие escape-последовательности не распознаются. Обратная косая черта, за которой не следует `\"` или `\\` включена в поиск, без изменений.\n\nДополнительные escape-последовательности, такие как `\\n` сопоставление нового символа, поддерживаются в регулярных выражениях. См. статью [\"Использование регулярных выражений](#using-regular-expressions)\".\n\n## Использование логических операций\n\nПоиск кода поддерживает логические выражения. Операторы можно использовать и `AND` объединить термины `OR``NOT`поиска.\n\nПо умолчанию смежные термины, разделенные пробелами, эквивалентны использованию `AND` оператора. Например, поисковый запрос `sparse index` совпадает с `sparse AND index`тем, что результаты поиска будут содержать все документы, содержащие термины `sparse` и `index`в любом порядке.\n\nДля поиска документов, содержащих один или другой термин, можно использовать `OR` оператор. Например, следующий запрос будет соответствовать документам, содержащим либо `sparse``index`:\n\n```text\nsparse OR index\n```\n\nЧтобы исключить файлы из результатов поиска, можно использовать `NOT` оператор. Например, чтобы исключить файлы в `__testing__` каталоге, можно выполнить поиск:\n\n```text\n\"fatal error\" NOT path:__testing__\n```\n\nСкобки можно использовать для выражения более сложных логических выражений. Например:\n\n```text\n(language:ruby OR language:python) AND NOT path:\"/tests/\"\n```\n\n## Использование квалификаторов\n\nВы можете использовать специализированные ключевые слова для квалификации поиска.\n\\*\n[Квалификатор репозитория](#repository-qualifier)\n\\*\n[Квалификаторы организации и пользователей](#organization-and-user-qualifiers)\n\\*\n[Корпоративный квалификатор](#enterprise-qualifier)\n\\*\n[Квалификатор языка](#language-qualifier)\n\\*\n[Квалификация на лицензию](#license-qualifier)\n\\*\n[Квалификатор пути](#path-qualifier)\n\\*\n[Квалификатор символов](#symbol-qualifier)\n\\*\n[Квалификатор содержимого](#content-qualifier)\n\\*\n[Квалификатор Is](#is-qualifier)\n\n### Квалификатор репозитория\n\nДля поиска в репозитории используйте `repo:` квалификатор. Необходимо указать полное имя репозитория, включая владельца. Например:\n\n```text\nrepo:github-linguist/linguist\n```\n\nДля поиска в наборе репозиториев можно объединить несколько `repo:` квалификаторов с логическим оператором `OR`. Например:\n\n```text\nrepo:github-linguist/linguist OR repo:tree-sitter/tree-sitter\n```\n\n> \\[!NOTE]\n> Поиск кода в настоящее время не поддерживает регулярные выражения или частичное сопоставление имен репозитория, поэтому вам придется ввести все имя репозитория (включая префикс пользователя), чтобы `repo:` квалификатор работал.\n\n### Квалификаторы организации и пользователей\n\nДля поиска файлов в организации используйте `org:` квалификатор. Например:\n\n```text\norg:github\n```\n\nЧтобы найти файлы в личная учетная запись, используйте `user:` квалификатор. Например:\n\n```text\nuser:octocat\n```\n\n> \\[!NOTE]\n> Поиск кода в настоящее время не поддерживает регулярные выражения или частичное сопоставление для имен организаций или пользователей, поэтому вам придется ввести имя всей организации или пользователя для работы квалификатора.\n\n### Корпоративный квалификатор\n\nДля поиска файлов на предприятии используйте квалификатор.`enterprise:` Например:\n\n```text\nenterprise:octocorp\n```\n\nПри этом выполняется поиск в репозиториях, принадлежащих организациям предприятия `octocorp` . Репозитории, принадлежащие пользователям, не включаются.\n\n### Квалификатор языка\n\nЧтобы сузить выбор до конкретного языка, используйте `language:` уточнение. Например:\n\n```text\nlanguage:ruby OR language:cpp OR language:csharp\n```\n\nПолный список поддерживаемых имен языков см [. в разделе language.yaml](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml) в [github-linguist/linguist/linguist](https://github.com/github-linguist/linguist). Если предпочитаемый язык отсутствует в списке, можно открыть запрос на вытягивание, чтобы добавить его.\n\n### Квалификация на лицензию\n\nДля фильтрации репозиториев по их лицензии или семейству лицензий используйте `license:` квалификатор и точное ключевое слово лицензии, например `Apache-2.0`, `CC`, `MIT`.\n\n```text\nlicense:MIT\n```\n\nСм. [Лицензирование репозитория](/ru/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository#searching-github-by-license-type) для списка ключевых слов лицензии.\n\n### Квалификатор пути\n\nДля поиска в пути к файлам используйте `path:` квалификатор. Это будет соответствовать файлам, содержащим термин в любом месте пути к файлу. Например, чтобы найти файлы, содержащие термин `unit_tests` в пути, используйте следующую команду:\n\n```text\npath:unit_tests\n```\n\nПриведенный выше запрос будет соответствовать обоим `src/unit_tests/my_test.py` и `src/docs/unit_tests.md` так как они оба содержат `unit_test` где-то в пути.\n\nЧтобы сопоставить только определенное имя файла (и не часть пути), можно использовать регулярное выражение:\n\n```text\npath:/(^|\\/)README\\.md$/\n```\n\nОбратите внимание, что `.` в имени файла экранируется, так как `.` имеет особое значение для регулярных выражений. Дополнительные сведения об использовании регулярных выражений см. в разделе [\"Использование регулярных выражений](#using-regular-expressions)\".\n\n<br>\n\nМожно также использовать некоторые ограниченные выражения глобов в квалификаторе `path:` .\n\nНапример, для поиска файлов с расширением `txt`можно использовать следующее:\n\n```text\npath:*.txt\n```\n\n<br>\nЧтобы найти файлы JavaScript в каталоге, можно использовать следующее `src` :\n\n```text\npath:src/*.js\n```\n\n* По умолчанию выражения glob не привязаны к началу пути, поэтому приведенное выше выражение по-прежнему соответствует пути, например `app/src/main.js`. Но если вы префиксуете выражение с `/`помощью, он привязится к началу. Например:\n\n  ```text\n  path:/src/*.js\n  ```\n\n* Обратите внимание, что `*` не соответствует символу `/` , поэтому для приведенного выше примера все результаты будут прямыми потомками `src` каталога. Для сопоставления в подкаталогах, чтобы результаты включали глубоко вложенные файлы, например `/src/app/testing/utils/example.js`, можно использовать `**`. Например:\n\n  ```text\n  path:/src/**/*.js\n  ```\n\n<br>\n\nВы также можете использовать глобальный `?` символ. Например, чтобы сопоставить путь `file.aac` или `file.abc`использовать следующее:\n\n```text\npath:*.a?c\n```\n\n<br>\nДля поиска имени файла, содержащего специальный символ, `*` или `?`просто используйте в кавычки строку:\n\n```text\npath:\"file?\"\n```\n\nВыражения glob отключены для кавычек, поэтому приведенный выше запрос будет соответствовать только путям, содержащим литеральную строку `file?`.\n\n### Квалификатор символов\n\nВы можете искать определения символов в коде, например определения функций или классов, используя `symbol:` квалификатор. Поиск символов основан на парсере вашего кода с помощью экосистемы парсера open source [Tree-sitter](https://github.com/tree-sitter), поэтому не требуется дополнительная настройка или интеграция инструментов сборки.\n\nНапример, для поиска символа с именем `WithContext`:\n\n```text\nlanguage:go symbol:WithContext\n```\n\nНа некоторых языках можно искать символы с помощью префикса (например, префикса имени класса). Например, для метода `deleteRows` структуры `Maint`можно выполнить поиск `symbol:Maint.deleteRows` , если вы используете Go или `symbol:Maint::deleteRows` в Rust.\n\nВы также можете использовать регулярные выражения с квалификатором символов. Например, следующий запрос будет находить преобразования, реализованные в Rust для `String` типа:\n\n```text\nlanguage:rust symbol:/^String::to_.*/\n```\n\nОбратите внимание, что этот квалификатор ищет только определения и не ссылается, а не все типы символов или языки пока полностью поддерживаются. Извлечение символов поддерживается для следующих языков:\n\n* Bash\n* C\n* C#\n* C++\n* CodeQL\n* Elixir\n* Go\n* JSX\n* Java\n* JavaScript\n* Lua\n* PHP\n* Protocol Buffers\n* Python\n* R\n* Ruby\n* Rust\n* Scala\n* Starlark\n* Swift\n* Typescript\n\nМы работаем над добавлением поддержки для дополнительных языков. Если вы хотите внести вклад в эту работу, вы можете добавить поддержку вашего языка в экосистему парсера open source [Tree-sitter](https://github.com/tree-sitter), на которой основан поиск символов.\n\n### Квалификатор содержимого\n\nПо умолчанию обнаженные термины выполняют поиск как пути, так и содержимое файла. Чтобы ограничить поиск строго соответствующим содержимому файла, а не пути к файлам, используйте `content:` квалификатор. Например:\n\n```text\ncontent:README.md\n```\n\nЭтот запрос будет соответствовать только файлам, содержащим термин `README.md`, а не соответствующим файлам с именем `README.md`.\n\n### Квалификатор Is\n\nДля фильтрации на основе свойств репозитория можно использовать `is:` квалификатор.\n`is:` поддерживает следующие значения:\n\n* ```\n          `archived`: ограничивает поиск архивными репозиториями.\n  ```\n* ```\n          `fork`: ограничивает поиск вилками репозиториев.\n  ```\n* ```\n          `vendored`: ограничивает поиск контентом, обнаруженным как поставщик.\n  ```\n* ```\n          `generated`: ограничивает поиск содержимого, обнаруженного как созданное.\n  ```\n\nНапример:\n\n```text\npath:/^MIT.txt$/ is:archived\n```\n\nОбратите внимание, что `is:` квалификатор можно изменить с `NOT` помощью оператора. Чтобы найти неархивированные репозитории, можно выполнить поиск:\n\n```text\nlog4j NOT is:archived\n```\n\nЧтобы исключить вилки из результатов, можно выполнить поиск:\n\n```text\nlog4j NOT is:fork\n```\n\n## Использование регулярных выражений\n\nПоиск кода поддерживает регулярные выражения для поиска шаблонов в коде. Регулярные выражения можно использовать в терминах поиска, а также во многих квалификаторов, окружив регрессию косыми чертами.\n\nНапример, для поиска регулярного выражения `sparse.*index`используется:\n\n```text\n/sparse.*index/\n```\n\nОбратите внимание, что вам придется экранировать любые косые черты вперед в регулярном выражении. Например, для поиска файлов в каталоге `App/src` используется:\n\n```text\n/^App\\/src\\//\n```\n\nВнутри регулярного выражения обозначает `\\n` новый символ строки, `\\t` обозначает вкладку и `\\x{hhhh}` может использоваться для экранирования любого символа Юникода. Это означает, что вы можете использовать регулярные выражения для поиска точных строк, содержащих символы, которые нельзя вводить в строку поиска.\n\nНаиболее распространенные функции регулярных выражений работают в поиске кода. Однако утверждения \"осматривать вокруг\" не поддерживаются.\n\n## Разделение терминов поиска\n\nВсе части поиска, такие как условия поиска, точные строки, регулярные выражения, квалификаторы, скобки и логические ключевые слова, `AND`и `OR`должны быть разделены друг от друга пробелами`NOT`. Одним из исключений является то, что элементы внутри скобки, `(``)`не нужно отделять от круглых скобок.\n\nЕсли поиск содержит несколько компонентов, которые не разделены пробелами или другим текстом, который не соответствует приведенным выше правилам, поиск кода попытается угадать, что вы означают. Он часто возвращается к обработке этого компонента запроса как точного текста для поиска. Например, следующий запрос:\n\n```text\nprintf(\"hello world\\n\");\n```\n\nПоиск кода будет отказаться от интерпретации скобки и кавычки в качестве специальных символов и вместо этого будет искать файлы, содержащие этот точный код.\n\nЕсли поиск кода угадывает неправильно, вы всегда можете получить поиск, который вы хотите, используя кавычки и пробелы, чтобы сделать смысл понятным.\n\n## Учет регистра\n\nПо умолчанию поиск кода не учитывает регистр, и результаты будут включать как верхний регистр, так и строчные результаты. Вы можете выполнять поиск с учетом регистра с помощью регулярного выражения с отключенным регистром без учета регистра. Например, для поиска строки \"True\" используется:\n\n```text\n/(?-i)True/\n```"}