假设我有这样的情况:

something,"another thing"

这可以通过正常的拆分功能轻松拆分.

现在我想要有更复杂的语法,我做到了:

something,"in a string, oooh",rgba(4,2,0)

这不适用于常规拆分函数.

我try 过在特定类型的令牌中替换逗号之类的东西,但这太复杂了,我觉得肯定有更好的方法.

然后我try 了正则表达式,它很管用,直到我不得不添加一个新的功能,它不能与我已有的regexp一起工作(这很糟糕),而且regexp匹配可能会很慢,这应该是尽可能快的.

有什么更好的方法来解决这个问题呢?

以下是额外上下文https://github.com/hyprland-community/hyprparse的源回购 所讨论的格式是hyprland配置格式

推荐答案

在保持上下文状态的情况下迭代字符串:

  1. 在一个".."
  2. 在一个(...)内

在上下文中,逗号没有分隔符的意思.

Limitations:这是一个午夜黑客!

另见Rust Playground

fn split(s: String) -> Vec<String> {
    let mut context = 无;
    let mut i = 0;
    let mut start = 0;
    let mut items = Vec::new();
    
    for c in s.chars() {
        if context == Some('"') {
            if c == '"' {
                context = 无;
            }
            i = i+1;
            continue;
        } else if context == Some('(') {
            if c == ')' {
                context = 无;
            }
            i = i+1;
            continue;
        }
        
        if c == '"' || c == '(' {
            context = Some(c);
        }
        
        if c == ',' && context.is_none() {
            items.push(s[start..i].to_string());
            start = i + 1;
        }
        
        i = i+1;
    }
    items.push(s[start..i].to_string());
    items
}


fn main() {
    let s = "something,\"in a string, oooh\",rgba(4,2,0)".to_string();
    println!("{:?}", split(s));
    // -> ["something", "\"in a string, oooh\"", "rgba(4,2,0)"]
}

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

关于Rust 中回归的逻辑

有没有更好的方法从HashMap的条目初始化 struct ?

如何实现泛型枚举的`Serde::Desialize`特性

在Rust中,如果Result是Err,运行副作用(如日志(log)记录)的惯用方法是什么

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

铁 rust ,我的模块介绍突然遇到了一个问题

失真图像图形捕获Api

什么是`&;[][..]`铁 rust 里的刻薄?

为什么我需要 to_string 函数的参考?

如何为整数切片定义一个带有额外函数的特性别名?

返回优化后的标题:返回异步块的闭包的类型擦除

为什么这段 Rust 代码会在没有递归或循环的情况下导致堆栈溢出?

如何在 Rust 中按 char 对字符串向量进行排序?

std::vector::shrink_to_fit 如何在 Rust 中工作?

在运行时在 Rust 中加载字体

为什么 Rust 允许写入不可变的 RwLock?

将 `&T` 转换为新类型 `&N`

使用 `.` 将 T 转换为 &mut T?

为什么这个值在上次使用后没有下降?