regex - 将所有正则表达式匹配捕获到一个向量中
问题描述
我想捕获一个字符串中的所有数字并返回一个整数向量,如下所示(结果可以是一个空向量):
fn str_strip_numbers(s: &str) -> Vec<isize> {
unimplemented!()
}
一个 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 中获取它的惯用方法是什么?
升级版:
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})
}
我尝试过这样的事情,这在不止一个方面是严重错误的。什么是正确的方法?
解决方案
如果您想要所有匹配项,那么您可能想要使用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()
}
推荐阅读
- java - 无法使用 servlet 和 JavaMail 发送电子邮件
- java - Java 抛出“PersistenceException:SQLGrammarException:无法提取结果集”
- c# - 使用 rest 更新 azure cdn 中的 blob 内容类型
- security - 如何删除网站 url 名称中的反射跨站点脚本
- php - 插入单条记录,获取最后插入的 ID,然后进行多条插入
- java - 找出池中有多少排队的任务
- ios - AFNetworking memory leak
- extjs - Extjs在存储中添加多条记录
- javascript - 如何在chart.js中使y轴在0处与x轴相交
- react-native - 反应原生授权