gpt4 book ai didi

regex - 在 Rust 中将正则表达式捕获转换为 HashMap?

转载 作者:行者123 更新时间:2023-11-29 07:57:59 24 4
gpt4 key购买 nike

我有一个 Regex具有未知数量的未知名称的命名组。我想将一个字符串与该正则表达式匹配,并获得 HashMap<&str, &str>以组名作为键,捕获的字符串作为值。

我该怎么做?我必须使用 regex.captures(str).iter() 吗?然后以某种方式映射和过滤并收集到 map 中?或者有什么捷径?

最佳答案

这很棘手,因为正则表达式可以有多个匹配项,并且每个捕获可以在单个全局匹配项中匹配多次。

也许是这样的(playground) :

fn main() {
let re = Regex::new(r"(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})").unwrap();
let text = "2012-03-14";
let caps = re.captures(text).unwrap();
let dict: HashMap<&str, &str> = re
.capture_names()
.flatten()
.filter_map(|n| Some((n, caps.name(n)?.as_str())))
.collect();
println!("{:#?}", dict);
}

输出:

{
"y": "2012",
"d": "14",
"m": "03"
}

一旦意识到捕获名称在 Match 中不可用,代码就很简单了。本身,但来自 parent Regex .您必须执行以下操作:

  1. 调用capture_names() , 那将是 Option<&str> 的可迭代对象.
  2. flatten()可迭代的,将删除 None打开 &str值(value)观。
  3. filter_map()将名称捕获到 (&str, &str) 类型的元组列表 (name, value) . filter需要删除不存在的捕获(感谢@Anders)。
  4. collect() !这之所以有效,是因为 HashMap<K, V>实现特征 FromIterator<(K, V)> , 所以 (&str, &str) 的迭代器收集到 HasMap<&str, &str> .

关于regex - 在 Rust 中将正则表达式捕获转换为 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54259474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com