Захватить все регулярные выражения в вектор - PullRequest
1 голос
/ 19 сентября 2019

Я хотел бы захватить все числа в строке и вернуть вектор целых чисел, что-то вроде этого (результат может быть пустым вектором):

fn str_strip_numbers(s: &str) -> Vec<isize> {
    ...
}

Прототип Python:

def str_strip_numbers(s):
    """
    Returns a vector of integer numbers
    embedded in a string argument.
    """
    return [int(x) for x in re.compile('\d+').findall(s)]

Для "alfa" результат равен [], для "42by4" это [42, 4].

Какой идиоматический способ получить его в Rust?

UPD:

fn str_strip_numbers(s: &str) -> Vec<String> {
    lazy_static! {
        static ref RE: Regex = Regex::new(r"\d+").unwrap();
    }
    RE.captures(s).and_then(|cap| {cap})
}

Я пробовал что-то подобное, что грубо неверно по нескольким подсчетам.Каков будет правильный подход?

1 Ответ

3 голосов
/ 19 сентября 2019

Если вам нужны все совпадения, то вы, вероятно, захотите использовать find_iter(), что дает вам итератор для всех совпадений.Затем вам нужно преобразовать совпадения строк в целые числа и, наконец, собрать результаты в вектор.

use lazy_static::lazy_static;
use regex::Regex;

fn str_strip_numbers(s: &str) -> Vec<i64> {
    lazy_static! {
        static ref RE: Regex = Regex::new(r"\d+").unwrap();
    }
    // iterate over all matches
    RE.find_iter(s)
        // try to parse the string matches as i64 (inferred from fn type signature)
        // and filter out the matches that can't be parsed (e.g. if there are too many digits to store in an i64).
        .filter_map(|digits| digits.as_str().parse().ok())
        // collect the results in to a Vec<i64> (inferred from fn type signature)
        .collect()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...