если регулярка ничего не найдет
Хочу в функции например 20 регулярок для 1 строки, и в зависимости от того, какая именно регулярка сработает, возвращать разный результат функции.
Вот код: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=813252c6a402fab504011229244cfa5f
Если в 4 строке добавить последним символом пробел в строку, паниковать не будет
Так не используй unwrap
хорошо, что использовать?
зависит от того что ты хочешь
И если это реальный код, а не просто пример, то лучше использовать one_cell, а не создавать каждый раз регулярку. Это накладно
https://doc.rust-lang.org/nightly/std/cell/struct.LazyCell.html или так)
функция принимает в себя строку. функция прогоняет строку через 20 регулярок и в зависимости от того, какая регулярка срабатывает, возвращает разный результат. если уж никакая регулярка не сработает (инвариант), пусть паникует
а если сматчились две регулярки?
звучит как if let в чистом виде
как только первая в функции метчится, отдаётся результат и остальные регулярки даже не проверяются
а такое может быть? если делать через match блок и не параллелизовывать match
то есть у тебя есть последовательность регулярок и ты хочешь найти первую сматчившуюся?
вот референс. если метчится, достаём группу из строки, делаем return. если не метчится, пропускаем и идём дальше по коду
if let Some(cap) = .... { return ... }
а что смешного?) мне всё равно для каждой регулярки вручную прописывать результат который будет возвращать функция
если нужно под каждую регулярку прописывать то только match-блоком будет приятно читаться
не могу представить, как это выглядит
Ну тогда можно предусмотреть что она будет возвращать, если ничего не найдет. Это так и делается. Или Option<T> / Result<T>, или дефолтное T, или panic Другого варианта нет
пока вот это решение думаю попробовать позже, топорно, логично, как я представлял если что-то можно лучше сделать, давайте придумаем
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=a9187c741be4cf63eb2bb7c578ff7a12 что-то такое?
скорее всего, но это код точно не для новичка, и я не могу себе позволить просто скопипастить его. я даже просто прочитав его пару раз, не могу понять что тут как работает
Создает массив регулярных выражений и проходится по этому массиву пытаясь спарсить один и тот же входной текст каждым регулярным выражением. Останавливается на первом совпадении. Можно оптимизировать и далее. Например vec! в LazyLock лишний, а хранить указатель на функцию рядом с регулярным выражением явно лишнее. Можно просто сделать impl Foo<'_> { fn new<'a>(...) -> Foo<'a> { ... } }
да, вектор можно на массив заменить
Обсуждают сегодня