Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

RegEx

Наследует: RefCounted < Object

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

Описание

Регулярное выражение (или regex) — это компактный язык, который можно использовать для распознавания строк, следующих определенному шаблону, например, URL-адресов, адресов электронной почты, целых предложений и т. д. Например, регулярное выражение ab[0-9] найдет любую строку, которая представляет собой ab, за которой следует любое число от 0 до 9. Для более подробного изучения вы легко найдете различные руководства и подробные объяснения в Интернете.

Для начала необходимо скомпилировать объект RegEx с шаблоном поиска с помощью метода compile(). В качестве альтернативы, для создания и компиляции объекта RegEx за один вызов метода можно использовать статический метод create_from_string().

var regex = RegEx.new()
regex.compile("\\w-(\\d+)")
# Сокращенная запись для создания и компиляции регулярного выражения (используется в примерах ниже):
var regex2 = RegEx.create_from_string("\\w-(\\d+)")

В GDScript шаблон поиска необходимо сначала экранировать, прежде чем экранировать его для выражения. Например, compile("\\d+") будет прочитано регулярным выражением как \d+. Аналогично, compile("\"(?:\\\\.|[^\"])*\"") будет прочитано как "(?:\\.|[^"])*". В GDScript также можно использовать строковые литералы (r-строки). Например, compile(r'"(?:\\.|[^"])*"') будет прочитано так же.

Используя search(), вы можете найти шаблон в заданном тексте. Если шаблон найден, возвращается RegExMatch, и вы можете получить подробную информацию о результатах, используя такие методы, как RegExMatch.get_string() и RegExMatch.get_start().

var regex = RegEx.create_from_string("\\w-(\\d+)")
var result = regex.search("abc n-0123")
if result:
    print(result.get_string()) # Выводит "n-0123"

Результаты захвата групп () можно получить, передав номер группы различным методам в RegExMatch. Группа 0 является группой по умолчанию и всегда будет ссылаться на весь шаблон. В приведенном выше примере вызов result.get_string(1) даст вам 0123.

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

var regex = RegEx.create_from_string("d(?<digit>[0-9]+)|x(?<digit>[0-9a-f]+)")
var result = regex.search("the number is x2f")
if result:
    print(result.get_string("digit")) # Выводит "2f"

Если вам нужно обработать несколько результатов, метод search_all() генерирует список всех непересекающихся результатов. Для удобства его можно комбинировать с циклом for.

# Выводит "01 03 0 3f 42"
for result in regex.search_all("d01, d03, d0c, x3f and x42"):
    print(result.get_string("digit"))

Пример: Разделение строки с помощью регулярного выражения:

var regex = RegEx.create_from_string("\\S+") # Класс символов отрицательных пробелов.
var results = []
for result in regex.search_all("One  Two \n\tThree"):
    results.push_back(result.get_string())
print(results) # Выводит ["One", "Two", "Three"]

Примечание: Реализация регулярных выражений в Godot основана на библиотеке PCRE2. Полный справочник шаблонов можно посмотреть здесь `.

[b]Совет:[/b] Вы можете использовать [url=https://regexr.com/]Regexr <https://www.pcre.org/current/doc/html/pcre2pattern.html>`__ для тестирования регулярных выражений онлайн.

Методы

void

clear()

Error

compile(pattern: String, show_error: bool = true)

RegEx

create_from_string(pattern: String, show_error: bool = true) static

int

get_group_count() const

PackedStringArray

get_names() const

String

get_pattern() const

bool

is_valid() const

RegExMatch

search(subject: String, offset: int = 0, end: int = -1) const

Array[RegExMatch]

search_all(subject: String, offset: int = 0, end: int = -1) const

String

sub(subject: String, replacement: String, all: bool = false, offset: int = 0, end: int = -1) const


Описания метода

void clear() 🔗

Этот метод сбрасывает состояние объекта, как будто он был только что создан. А именно, он отменяет назначение регулярного выражения этому объекту.


Error compile(pattern: String, show_error: bool = true) 🔗

Компилирует и назначает шаблон поиска для использования. Возвращает @GlobalScope.OK, если компиляция прошла успешно. Если компиляция не удалась, возвращает @GlobalScope.FAILED, а когда show_error равен true, подробности выводятся на стандартный вывод.


RegEx create_from_string(pattern: String, show_error: bool = true) static 🔗

Создает и компилирует новый объект RegEx. См. также compile().


int get_group_count() const 🔗

Возвращает количество групп захвата в скомпилированном шаблоне.


PackedStringArray get_names() const 🔗

Возвращает массив имен именованных групп захвата в скомпилированном шаблоне. Они упорядочены по внешнему виду.


String get_pattern() const 🔗

Возвращает исходный шаблон поиска, который был скомпилирован.


bool is_valid() const 🔗

Возвращает, назначен ли этому объекту допустимый шаблон поиска.


Выполняет поиск скомпилированного шаблона в тексте. Возвращает контейнер RegExMatch первого совпадающего результата, если он найден, в противном случае null.

Область поиска можно указать с помощью offset и end. Это полезно при поиске другого совпадения в том же subject путем повторного вызова этого метода после предыдущего успешного выполнения. Обратите внимание, что установка этих параметров отличается от передачи сокращенной строки. Например, начальный якорь ^ не зависит от offset, а символ перед offset будет проверяться на границу слова \b.


Array[RegExMatch] search_all(subject: String, offset: int = 0, end: int = -1) const 🔗

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

Область для поиска можно указать с помощью offset и end. Это полезно при поиске другого совпадения в том же subject путем повторного вызова этого метода после предыдущего успешного выполнения. Обратите внимание, что установка этих параметров отличается от передачи сокращенной строки. Например, начальный якорь ^ не зависит от offset, а символ перед offset будет проверяться на границу слова \b.


String sub(subject: String, replacement: String, all: bool = false, offset: int = 0, end: int = -1) const 🔗

Выполняет поиск скомпилированного шаблона в тексте и заменяет его указанной строкой. Экранированные символы и обратные ссылки, такие как $1 и $name, раскрываются и разрешаются. По умолчанию заменяется только первый экземпляр, но его можно изменить для всех экземпляров (глобальная замена).

Область поиска можно указать с помощью offset и end. Это полезно при поиске другого совпадения в том же subject путем повторного вызова этого метода после предыдущего успешного выполнения. Обратите внимание, что установка этих параметров отличается от передачи сокращенной строки. Например, начальный якорь ^ не зависит от offset, а символ перед offset будет проверяться на границу слова \b.