- Поддерживаемые версии
- 1.21
- Ядра и Прокси
- Spigot
- Минимальная версия Java
- 17
Re2Addon
Добавляет поддержку регулярных выражений You must be logged in to see this link. в
скрипты You must be logged in to see this link. через
библиотеку You must be logged in to see this link..
Требует установленный и включённый LuaMine.
Почему RE2, а не стандартный regex?
RE2 специально спроектирован так, чтобы гарантировать линейное время матчинга
без катастрофического backtracking'а — класса бага, при котором составленный
(или просто неудачный) regex-паттерн может подвесить поток на секунды или минуты
на определённом вводе. Это важно именно здесь: скрипты LuaMine по своей природе менее
доверенный код, чем ваш собственный серверный код, поэтому безопасно открыть им regex
означает выбрать движок, который нельзя превратить в вектор отказа в обслуживании
даже обычным (не злонамеренным) паттерном.
Использование
Строки-паттерны, переданные в свободные функции, кэшируются внутри — повторный вызов
заново каждый раз.
Ссылки
Добавляет поддержку регулярных выражений You must be logged in to see this link. в
скрипты You must be logged in to see this link. через
библиотеку You must be logged in to see this link..
Требует установленный и включённый LuaMine.
Почему RE2, а не стандартный regex?
RE2 специально спроектирован так, чтобы гарантировать линейное время матчинга
без катастрофического backtracking'а — класса бага, при котором составленный
(или просто неудачный) regex-паттерн может подвесить поток на секунды или минуты
на определённом вводе. Это важно именно здесь: скрипты LuaMine по своей природе менее
доверенный код, чем ваш собственный серверный код, поэтому безопасно открыть им regex
означает выбрать движок, который нельзя превратить в вектор отказа в обслуживании
даже обычным (не злонамеренным) паттерном.
Использование
Код:
local re2 = require("re2")
-- Свободные функции - паттерн строкой
re2.matches("[0-9]+", "hello123") -- false (строка должна совпасть целиком)
re2.find("[0-9]+", "hello123world") -- 5, 8
re2.findAll("[0-9]+", "a1 b22 c333") -- таблица {start, end, match}
re2.replace("[0-9]+", "a1b2c3", "X") -- "aXb2c3" (только первое совпадение)
re2.replaceAll("[0-9]+", "a1b2c3", "X") -- "aXbXcX"
re2.split(",", "one,two,three") -- {"one", "two", "three"}
re2.quote("a.b*c") -- строка с экранированием как литерал
re2.valid("[unclosed") -- false
-- ООП-стиль - скомпилировать один раз, переиспользовать
local p = re2.compile("[a-z]+")
p:matches("hello")
p:find("123hello456")
p:replace("abc123def", "X")
Строки-паттерны, переданные в свободные функции, кэшируются внутри — повторный вызов
re2.matches("some.pattern", text) с одной и той же строкой не компилирует regexзаново каждый раз.
Ссылки
- Зависимости
- LuaMine
- Команды и права
- -