Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Rust中将正则表达式捕获转换为HashMap?_Regex_Hashmap_Rust_Regex Group - Fatal编程技术网

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);