Pull to refresh

Comments 12

А почему бы не отключить backtracking с помощью "ревнивых" Possessive quantifiers? Просто добавьте плюс к квантификатору. Пример: ".*+" сопоставит только строки, обрамлённые двойными кавычками и только их. Для строки "abc"x не вернёт ничего. А с жадным ".*" получим подстроку "abc". Ниже скинул их синтаксис. Также в догонку скинул ленивые.

Ревнивые:

*+, ?+, ++.

Ленивые:

*?, ??, +?

Иногда текст регэкспа вводит пользователь. Это очень удобная фича в интерфейсе для продвинутых пользователей.

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

Конечное или линейное?

Если мне не изменяет память там квадрат. Длина регэкспа умножить на длину строки в которой ищем. Так что скорее конечное, а не линейное.

С backtracking и grouping вполне, время может быть экспоненциальным, или же 2^n. Это если начать сканить все подмножества множества символов строки.

Я про re2j. Экспоненциальное время выполнения зависящее не только от длины входных данных, но и от их состава, назвать конечным никак нельзя.

Если Вы имеете в виду под конечным временем "постоянное", то нет. И даже квадрат уже не линейное время, а полиномиальное.

Если ревнивые квантификаторы не поддерживаются, Вы можете использовать атомарные группы. Атомарные группы = не ссылаемые группы, которые делают позиции, которые подходят под эту группу НЕВОЗВРАТНЫМИ.

Синтаксис: (?>group)

Для строки ".*+"x надо писать

"(?>.*)"x

так проблема в том, что эти регэкспы пишут не прогеры, а пользователи системы. И они явно не будут заморачиваться с жадными квантификаторами или группами...

Как тут не вставить бессмертную цитату Фридла?

У вас есть проблема. Вы решили использовать регулярные выражения, чтобы её решить. Теперь у вас две проблемы.

Re2j не поддерживает весь синтаксис регулярных выражений, который поддерживает стандартная java реализация

Вот это надо выделить особо, потому что у конечных автоматов есть свои непреодолимые ограничения.

Ну а вообще позволять клиентам по сути выполнять свой код - это "ой".

@DaniilRoman , так а какое у вас решение в сервисе в итоге? Не очень понял, были решены все классы проблем и все работает усреднённо шустро или только некоторые кейсы быстрые, остальное тормозит? Применяется какое-то гибридное решение по итогу или как?

Sign up to leave a comment.