从字符串中移除引号

Rust:
从字符串中移除引号

如何操作:

fn remove_quotes(s: &str) -> String {
    s.trim_matches(|c| c == '\"' || c == '\'').to_string()
}

fn main() {
    let quoted_str = "\"你好,Rustaceans!\"";
    let cleaned_str = remove_quotes(quoted_str);
    println!("{}", cleaned_str);
    // 输出:你好,Rustaceans!
}

有时你可能会碰到一个含有混合引号的字符串,像这样:

fn main() {
    let mixed_quoted = "'Rust说:\"你好,世界!\"'";
    let cleaned_str = remove_quotes(mixed_quoted);
    println!("{}", cleaned_str);
    // 输出:Rust说:"你好,世界!"
}

在这里,只有最外层的单引号被移除了。

深入解析

当从字符串中移除引号时,你可能会想知道为什么不只是简单地使用 .replace("\"", "")。早期,处理文本的标准化较少,不同系统有存储和传输文本的不同方式,通常对特殊字符使用某种“转义序列”。Rust 的 trim_matches 方法更加多功能,允许你指定多个要修剪的字符,以及是从字符串的开始(前缀)、结束(后缀)还是两侧进行修剪。

当然也有替代方法。Regex 是字符串操作的强大工具,能够匹配复杂的模式,而且对于仅仅移除引号来说可能有点大材小用。像 trim_in_place 这样的库能提供原地修剪而不需要创建新的 String 对象,这对于性能关键的应用来说可能是可取的。

在底层,trim_matches 实际上是从字符串的两端开始,通过字符地迭代检查所提供的模式,直到找到不匹配的字符。对于它所做的工作而言,它是高效的,但总是要意识到它是在处理 Unicode 标量值。如果你的字符串可能包含多字节的 Unicode 字符,你不必担心它会将它们分开。

参见

  • Rust 关于字符串操作的文档:https://doc.rust-lang.org/book/ch08-02-strings.html
  • 用于复杂模式的 regex 库:https://crates.io/crates/regex
  • Rust 通过实例学习编程场景:https://doc.rust-lang.org/stable/rust-by-example/std/str.html