1

我试图找到解析 a&str并提取出COMMAND_TYPE和命名参数的最佳方法。命名参数可以是任何东西。

这是建议的字符串(可以更改)。

COMMAND_TYPE(param1:2222,param2:"the quick \"brown\" fox, blah,", param3:true)

我一直在尝试几种方法来提取COMMAND_TYPE,这似乎相当简单:

pub fn parse_command(command: &str) -> Option<String> {
    let mut matched = String::new();
    let mut chars = command.chars();

    while let Some(next) = chars.next() {
        if next != '(' {
            matched.push(next);
        } else {
            break;
        }
    }
    if matched.is_empty() {
        None
    } else {
        Some(matched)
    }
}

从括号中提取参数似乎很简单:

pub fn parse_params(command: &str) -> Option<&str> {
    let start = command.find("(");
    let end = command.rfind(")");

    if start.is_some() && end.is_some() {
        Some(&command[start.unwrap() + 1..end.unwrap()])
    } else {
        None
    }
}

我一直在看nom crate,它看起来相当强大(而且很复杂),所以我不确定我是否真的需要使用它。

如何将括号之间的命名参数提取到 a 中HashMap

4

1 回答 1

1

您的代码似乎适用于提取命令和完整的参数列表。如果您不需要解析比这更复杂的东西,您可能可以避免使用 nom 作为依赖项。

但是,如果您想单独解析每个参数,您可能会遇到问题:您的格式似乎已损坏。在您的示例中,双引号和逗号都没有转义字符。param2只是不能干净地提取。

于 2019-08-09T13:18:22.630 回答