Regex 在Rust中将正则表达式捕获转换为HashMap?
我有一个Regex 在Rust中将正则表达式捕获转换为HashMap?,regex,hashmap,rust,regex-group,Regex,Hashmap,Rust,Regex Group,我有一个Regex,其中的命名组数量未知,名称未知。我想将一个字符串与该正则表达式匹配,并获得一个HashMap,其中组名作为键,捕获的字符串作为值 我该怎么做?我是否必须使用regex.captures(str).iter(),然后以某种方式映射、过滤并收集到映射中?或者有什么捷径吗?这很棘手,因为正则表达式可以有多个匹配,并且每个捕获可以在单个全局匹配中匹配多次 也许是这样的: 一旦您意识到捕获名称不是从Match本身提供的,而是从父Regex提供的,那么代码就很简单了。您必须执行以下操作:
Regex
,其中的命名组数量未知,名称未知。我想将一个字符串与该正则表达式匹配,并获得一个HashMap
,其中组名作为键,捕获的字符串作为值
我该怎么做?我是否必须使用
regex.captures(str).iter()
,然后以某种方式映射、过滤并收集到映射中?或者有什么捷径吗?这很棘手,因为正则表达式可以有多个匹配,并且每个捕获可以在单个全局匹配中匹配多次
也许是这样的:
一旦您意识到捕获名称不是从Match
本身提供的,而是从父Regex
提供的,那么代码就很简单了。您必须执行以下操作:
capture\u names()
,这将是选项的一个可选项
flant()
可编辑项,它将删除None
并展开&str
值filter\u map()
将名称捕获到类型为(&str,&str)
的元组(名称、值)列表中。需要使用过滤器
删除不存在的捕获(感谢@Anders)collect()
!这仅仅是因为HashMap
实现了来自迭代器的trait,所以(&str,&str)
的迭代器收集到HasMap
中
如果您有多个捕获,可以将它们收集到如下列表中:
let all: Vec<HashMap<&str, &str>> = re
.captures_iter("2012-01-12 , 2013-07-11 , 2014-09-14")
.map(|caps| {
re.capture_names()
.map(|o| o.and_then(|n| Some((n, caps.name(n)?.as_str()))))
.flatten()
.collect()
})
.collect();
println!("{:#?}", all);
let all:Vec=re
国际热核聚变实验堆(“2012-01-12013-07-112014-09-14”)
.map(| caps |{
关于捕获名称()
.map(|o | o.and|u then(| n | Some((n,caps.name(n)?.as_str()))
.flatte()
.collect()
})
.收集();
普林顿!(“{:#?}”,全部);
如果缺少一个命名组,这会导致恐慌。它可以通过使用filter\u map(|n | Some((n,captures.name(n)?.as\u str()))
而不是map
@Anders:哦,你说得对。我会按照你的建议来修的。尽管更惯用的解决方案是通过使用map(|n |(n,caps.name(n).map(| m | m.as_str()))来创建HasMap
,但这是一个很好的选项建议。
let all: Vec<HashMap<&str, &str>> = re
.captures_iter("2012-01-12 , 2013-07-11 , 2014-09-14")
.map(|caps| {
re.capture_names()
.map(|o| o.and_then(|n| Some((n, caps.name(n)?.as_str()))))
.flatten()
.collect()
})
.collect();
println!("{:#?}", all);