Привет всем :) Пытаюсь использовать регулярки в расте. Проблема: падает unwrap

если регулярка ничего не найдет

Хочу в функции например 20 регулярок для 1 строки, и в зависимости от того, какая именно регулярка сработает, возвращать разный результат функции.

Вот код: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=813252c6a402fab504011229244cfa5f

Если в 4 строке добавить последним символом пробел в строку, паниковать не будет

24 ответов

66 просмотров

Так не используй unwrap

Mark-Lansky Автор вопроса
Алишер Галиев
Так не используй unwrap

хорошо, что использовать?

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

Mark-Lansky Автор вопроса
Алиса Кассель-Королёва
зависит от того что ты хочешь

функция принимает в себя строку. функция прогоняет строку через 20 регулярок и в зависимости от того, какая регулярка срабатывает, возвращает разный результат. если уж никакая регулярка не сработает (инвариант), пусть паникует

Mark-Lansky Автор вопроса
Алиса Кассель-Королёва
а если сматчились две регулярки?

как только первая в функции метчится, отдаётся результат и остальные регулярки даже не проверяются

Алиса Кассель-Королёва
а если сматчились две регулярки?

а такое может быть? если делать через match блок и не параллелизовывать match

Mark Lansky
как только первая в функции метчится, отдаётся рез...

то есть у тебя есть последовательность регулярок и ты хочешь найти первую сматчившуюся?

Mark-Lansky Автор вопроса
Алиса Кассель-Королёва
то есть у тебя есть последовательность регулярок и...

вот референс. если метчится, достаём группу из строки, делаем return. если не метчится, пропускаем и идём дальше по коду

if let Some(cap) = .... { return ... }

Mark-Lansky Автор вопроса

а что смешного?) мне всё равно для каждой регулярки вручную прописывать результат который будет возвращать функция

если нужно под каждую регулярку прописывать то только match-блоком будет приятно читаться

Mark-Lansky Автор вопроса
Mark Lansky
а что смешного?) мне всё равно для каждой регулярк...

Ну тогда можно предусмотреть что она будет возвращать, если ничего не найдет. Это так и делается. Или Option<T> / Result<T>, или дефолтное T, или panic Другого варианта нет

Mark-Lansky Автор вопроса
Алишер Галиев
if let Some(cap) = .... { return ... }

пока вот это решение думаю попробовать позже, топорно, логично, как я представлял если что-то можно лучше сделать, давайте придумаем

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=a9187c741be4cf63eb2bb7c578ff7a12 что-то такое?

Mark-Lansky Автор вопроса

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

Mark Lansky
скорее всего, но это код точно не для новичка, и я...

Создает массив регулярных выражений и проходится по этому массиву пытаясь спарсить один и тот же входной текст каждым регулярным выражением. Останавливается на первом совпадении. Можно оптимизировать и далее. Например vec! в LazyLock лишний, а хранить указатель на функцию рядом с регулярным выражением явно лишнее. Можно просто сделать impl Foo<'_> { fn new<'a>(...) -> Foo<'a> { ... } }

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
Карта сайта