gpt4 book ai didi

rust - 当值包含键和值之间的分隔符或对之间的分隔符时,如何从字符串中提取键和值?

转载 作者:行者123 更新时间:2023-12-03 11:24:18 25 4
gpt4 key购买 nike

如何有效地将字符串中的键值对提取到 HashMap 中什么时候

  • key后面总是 :然后是值
  • value, 结尾其次是另一个 key (有时空格然后 key )
  • value可以包含 , :全场
  • value将包括任何 key
  • key的顺序s 不固定
  • key名字众所周知

  • 对于这些键值对

    key1:value1, key2:this is, some value2, key3:anothe:r val,ue,

    它应该产生这个 HashMap :

    "key1", "value1"
    "key2", "this is, some value2"
    "key3", "anothe:r val,ue"

    我尝试了以下代码,但仅使用 , 就不行了作为分隔符,因为该值可以始终包含逗号。
    "key1:value1, key2:this is, some value2, key3:anothe:r val,ue,"
    .split(",")
    .map(|kv| kv.splitn(2, ":").collect::<Vec<&str>>())
    .filter(|vec| vec.len() == 2)
    .map(|vec| (vec[0].trim().into(), vec[1].trim().into()))
    .collect()

    我的想法是提供一个键列表: ["key1", "key2", "key3"]用作分隔符

    更新:

    使用@Lucretiel 回答我想出了:
    fn key_value<'a>(keys: &[&str], mut command: &'a str) -> HashMap<&'a str, &'a str> {
    let mut hashmap = HashMap::new();
    loop {
    if let Some(key) = key(&keys, &command) {
    command = &command[key.len() + 1..];

    let value = value(&keys, &command);
    let trim: &[_] = &[',', ' '];
    command = &command[value.len()..].trim_start_matches(trim);

    hashmap.insert(key, value);
    } else {
    break;
    }
    }
    hashmap
    }

    fn key<'a>(keys: &[&str], command: &'a str) -> Option<&'a str> {
    let regex = format!("^({}):", keys.join("|"));
    let regex = regex::Regex::new(&regex).expect("Invalid regex");
    match regex.shortest_match(&command) {
    Some(position) => Some(&command[..position - 1]),
    None => None,
    }
    }

    fn value<'a>(keys: &[&str], command: &'a str) -> &'a str {
    let regex = format!(r#",\s*({}):"#, keys.join("|"));
    let regex = regex::Regex::new(&regex).expect("Invalid regex");
    match regex.find(&command) {
    Some(position) => &command[..position.start()],
    None => command,
    }
    }

    ( Playground )

    最佳答案

    解决这个问题的实际代码很重要,但可以做到。有很多细微的边缘情况,这取决于您要考虑的错误情况(例如,您是否要求输入字符串中存在已知键列表中的每个键以进行解析?是否允许重复键?等) .)基本算法如下所示:

  • 而 key 列表不为空:
  • 找到开始字符串的键,匹配 ^{key}: .这是当前的 key 。
  • 如果没有这样的键,就是一个错误;输入格式错误
  • 找到字符串中下一个最早的键,匹配 ,\s*{key}: .这是下一个关键。
  • 如果没有更多的键,则字符串的其余部分是该键的值
  • 否则,两个找到的键之间的所有内容都是当前值
  • 添加(当前键,当前值)到您的哈希表
  • 从 key 列表中删除当前 key (假设您不接受重复的 key )
  • 从输入字符串的前面切出(当前键,当前值)
  • 用完键后,返回哈希映射

  • 使用传统的语法无法做到这一点。正如所呈现的那样,它非常模棱两可。但是,如果您围绕扫描每个后续键来构建解析(假设键从不作为值中的子字符串出现),您可以成功解析这种输入。

    所描述的算法在二次时间内运行,但假设您创建一个复合正则表达式来同时搜索每个键,它应该可以简化为线性时间:
    ,\s*(key1|key2|key3|...):

    关于rust - 当值包含键和值之间的分隔符或对之间的分隔符时,如何从字符串中提取键和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61040596/

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