Comments 12
А почему бы не отключить backtracking с помощью "ревнивых" Possessive quantifiers? Просто добавьте плюс к квантификатору. Пример: ".*+" сопоставит только строки, обрамлённые двойными кавычками и только их. Для строки "abc"x не вернёт ничего. А с жадным ".*" получим подстроку "abc". Ниже скинул их синтаксис. Также в догонку скинул ленивые.
Ревнивые:
*+, ?+, ++.
Ленивые:
*?, ??, +?
Иногда текст регэкспа вводит пользователь. Это очень удобная фича в интерфейсе для продвинутых пользователей.
Re2j нужен если вы хотите быть уверены что ваш код гарантированно отработает за конечное время.
Конечное или линейное?
Если мне не изменяет память там квадрат. Длина регэкспа умножить на длину строки в которой ищем. Так что скорее конечное, а не линейное.
Если Вы имеете в виду под конечным временем "постоянное", то нет. И даже квадрат уже не линейное время, а полиномиальное.
Если ревнивые квантификаторы не поддерживаются, Вы можете использовать атомарные группы. Атомарные группы = не ссылаемые группы, которые делают позиции, которые подходят под эту группу НЕВОЗВРАТНЫМИ.
Синтаксис: (?>group)
Для строки ".*+"x надо писать
"(?>.*)"x
Как тут не вставить бессмертную цитату Фридла?
У вас есть проблема. Вы решили использовать регулярные выражения, чтобы её решить. Теперь у вас две проблемы.
Re2j не поддерживает весь синтаксис регулярных выражений, который поддерживает стандартная java реализация
Вот это надо выделить особо, потому что у конечных автоматов есть свои непреодолимые ограничения.
Ну а вообще позволять клиентам по сути выполнять свой код - это "ой".
@DaniilRoman , так а какое у вас решение в сервисе в итоге? Не очень понял, были решены все классы проблем и все работает усреднённо шустро или только некоторые кейсы быстрые, остальное тормозит? Применяется какое-то гибридное решение по итогу или как?
Re2j вместо стандартного regEx в Java: в каких случаях и как использовать